前提
Qiita初投稿です。
間違いなどがあれば、ご指摘いただけると幸いです。
自分の勉強用として記録します。現在スクールに通学中です。
createアクションのあとのredirect
以下、フリマアプリを作成する前提で記述する。
スクールでの学習では、createアクションの際、
以下のようにroot_pathにリダイレクトさせる記述がほとんど。
items_controller.rb
def create
@item = Item.new(item_params)
if @item.save
redirect_to root_path
else
render :new
end
end
前提として、itemモデルはnameカラムを持つ。
今回、createアクションで@itemがsaveできた際の
リダイレクト先を、ルートパスではなく、
生成したitemの詳細画面(show)にする記述を考える。
@itemには、パラメーターとしてidの値が含まれていないため、
ここでリダイレクト先にitem_path(params[:id])を指定しても
idがnilとなり、エラーになる。
これを解消するために、
items_controller.rb を以下のように書き換える。
def create
@item = Item.new
if @item.save
item = Item.find_by(name: @item.name)
redirect_to item_path(item.id)
else
render :new
end
end
上記のように、saveしたあとに別の変数(item)に、
@itemのnameカラムからfind_byメソッドを利用して保存したレコードを取得する。
これで@itemが保存された際のidが、itemのparamsに含まれる。
【注意】
上記ではnameカラムを利用したが、
前提として、nameカラムがユニークな値(一意性)である必要がある。
ユニークな値でないと、先に同じ値のnameのレコードが保存されていた際に、
今回saveしたレコードとは別のレコードが呼び出されてしまう。
本来、nameは重複する可能性があるカラムであるため、
別のカラムでユニークな値となるものがあれば、そちらを指定するのが良い。
上記以外に、やり方があればコメント等でおしえてください。