LoginSignup
1
0

More than 3 years have passed since last update.

【Rails】createアクションで保存した際に保存したデータにredirectする(showアクションへ)

Last updated at Posted at 2021-03-02

前提

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は重複する可能性があるカラムであるため、
別のカラムでユニークな値となるものがあれば、そちらを指定するのが良い。

上記以外に、やり方があればコメント等でおしえてください。

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0