うめぼしジョイスティック - ivoice

CakePHP、JavaScript、jQuery等のプログラミングについて書いていきます 思考は、うめぼしのように硬く、そして柔らかく。

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の値を変更する時

に用いる。