Railsのあれこれ その3
editとupdateはややこしい
editアクションとupdateアクションは結構頭がこんがらがります。
まずルーティングは
post "users/:id/update" => "users#update" get "users/:id/edit" => "users#edit"
こういう感じ。 この場合はusersコントローラのupdateとeditのアクションです。
コントローラーでは
def edit @user = User.find_by(id: params[:id]) end def update @user = User.find_by(id: params[:id]) @user.name = params[:name] @user.email = params[:email] if @user.save flash[:notice] = "ユーザー情報の編集完了" redirect_to("/users/#{@user.id}") else render("users/edit") end end
このように記述します。
ビューですが、
updateアクションにビューは必要ありません。 データを更新するだけのアクションです。
editアクションのビューは
<% @user.errors.full_messages.each do |message| %> <div class="form-error"> <%= message %> </div> <% end %> <%= form_tag("/users/#{@user.id}/update") do %> <p>ユーザー名</p> <input name="name" value="<%= @user.name %>"> <p>メールアドレス</p> <input name="email" value="<%= @user.email %>"> <input type="submit" value="保存"> <% end %>
このようになります。
最初に
@user.errors.full_messages
でeach文を回して投稿エラーメッセージを表示させているのがポイント。
そのあとに、投稿用のフォームを書きます。 name属性にデータベースのカラムと同じ名前をつけて投稿。
params[:name], params[:email] で受け取れるデータを、
@user.name = params[:name] @user.email = params[:email]
としてからセーブしているのがポイントです。
また、editアクションで投稿が失敗した際に
render("フォルダ名/ファイル名")
つまりは
render("users/edit")
となり、editについて、投稿失敗時のrenderではidは記述する必要がないのが大事なところです。
ルーティングの決まり(ログイン機能のsessionについて)
getは
■データベースを変更しない場合
に用いる。
postは
■データベースを変更する場合
■sessionの値を変更する時
に用いる。