Ruby on RailsでURLにid以外の任意の項目を指定したい

やりたいこと

Rails機械的に振られたidではなく、モデル的に意味のある値(ユーザ名とか話数とか)でアクセスできるようにしたい。

方法

URLを変更したいモデルのto_paramメソッドをオーバーライド
  • to_paramメソッドをオーバーライド
$ vi app/models/chapter.rb 
class Chapter < ActiveRecord::Base
 ・
 ・
 ・
  # 話数によるURLでのアクセスを可能とする
  def to_param
    # URLで指定する項目を指定
    chapter
  end
end
params[:id]で渡ってくる値が変わるのでそれに合わせてControllerを修正
  • 今まではChapterを一意に指定するchapter_idが渡ってきていたが、話数が渡ってくるようになったので対応。
$ vi app/models/chapter.rb 
@chapter = Chapter.find(params[:id])
↓
@chapter = Chapter.find_by_anime_id_and_chapter(params[:anime_id], params[:id])
  • ちなみに、下記のようにwhereを使ってChapterを取得しようとするとChapterは取れるのにView生成時にChapterの項目が取得できずエラーとなった。なんでだろう?
$ vi app/models/chapter.rb 
@chapter = Chapter.where('anime_id', params[:anime_id]).where('chapter',params[:id])

参考サイト