テックキャンプ77日目

kobasaです(´ω`*)引き続き投稿機能を実装していました。
アウトプット内容が、たまたま今回当てはまっただけなのか微妙なことになってきました。
前からそうなんですけどねw

77日目の勉強内容

user_signed_in? && current_user.idの記述について

<% if user_signed_in? && current_user.id == @prototype.user_id %>

条件式にてcurrent_userはログインしている前提のメソッドなので、
ユーザーがログインしているかを確認するuser_signed_in?の記述はいらないのでは?と思ったのですが、省いてしまうと

NoMethodError in Prototypes#show
undefined method `id’ for nil:NillClassのエラーとなってしまう。

ログインしていない場合、current_userの値がnilとなりcurrent_user.idを取得できずエラーが発生してしまうみたい。なのでuser_signed_in?の記述は必要。

リクエストにidの値を持たせる

<%= link_to prototype.title, prototype_path(prototype.id)%>

上記のようにPrefixの引数にidを記述すると、リクエストにidの値を持たせられる。
params{id: 値} 上記はshowアクションへのリクエスト。

コントローラーで受け取ったidの値と一致するレコードを探して変数に格納する。

  def show
    @prototype = Prototype.find(params[:id])
  end

個別のページに入れば、(URLにidの値が含まれる localhost:3000/prototypes/2)
現在のページの編集や削除へのパス指定に、Prefixの引数にidを記述しなくても実行できる。
うまく動くパターンだったかもしれないし、可読性の向上に記述した方が良いのかもしれない。

<%= link_to "編集する", edit_prototype_path(@prototype.id) %>
<%= link_to "削除する", prototype_path(@prototype.id), method: :delete %>
# (@prototype.id)の記述がなくても動いた。

変数をインスタンス変数で定義するか

create/updateアクションでDBに保存するときは、保存するデータをインスタンス変数に格納する必要はないが、
「保存できなかった場合、入力済の項目を保持したままフォームに移動させる」という処理を実行したいときはインスタンス変数にデータを格納しておく必要がある。

  def update
    @prototype = Prototype.find(params[:id])
    if @prototype.update(prototype_params)
      redirect_to prototype_path(@prototype.id)
    else
      render :edit #入力済の項目を保持したままフォームに移動
    end
  end

コメント

  1. ジョー より:

    「変数をインスタンス変数で定義するか」のところ、めちゃめちゃ参考になりました。感謝です。
    ここへきてインスタンス変数を使う意味って何なのかわからなくなってきていたので…^^;

    • kobasa より:

      正直なところ僕もよくわかっていませんw
      ビューファイルの記述の兼ね合いなども関係あるかもです。
      一連の流れとしては短い記述ばかりなので修正・検証がしやすいですが、
      いつまでも動いたからヨシ(´ω`*)というわけにはいきませんよねぇ…

タイトルとURLをコピーしました