私の知る限り、これはリソースを編集および更新するための標準的な Rails パターンです。
edit アクションの GET ルートと/users/:id/edit
、 update アクションの PUT ルートと PATCH ルートの両方があり/users/:id
ます。
これが私のコントローラーアクションです:
def edit
@user = User.find params[:id]
end
def update
@user = User.find params[:id]
if @user.update_attributes(user_params)
redirect_to @user, success: "Changes saved"
else
flash.now.alert = "Unable to change account details"
render :edit
end
end
そして、フォームのパーシャルでデフォルトの form_for を使用しています:
<%= form_for @user do |f| %>
これは、html で次のフォームを作成しています。
<form accept-charset="UTF-8" action="/users/1" id="edit_user_1" method="post">
...
<input name="_method" type="hidden" value="patch">
への呼び出しがupdate_attributes
成功すると、ユーザーは正しくリダイレクトされますが、(ActiveRecord の検証が原因で) 呼び出しが失敗すると、render アクションは編集ビューを正しく表示しますが、ユーザーのブラウザーのパスは から に変更さ/users/1/edit
れ/users/1
ます。
私が読んだことから、これはレールの予想される動作であるように見えますが、REST の背後にあるコアのアイデアは、URL がリソースの正規のビューを参照することであると思っていたので、混乱しているように見えますか?
代わりにredirect_to
編集アクションを実行するとrender
、URLは本来あるべきものになりますが、フォームのエラーメッセージが失われます。
redirect_to を使用する前にエラーをセッションにダンプするよりも、URL とエラー メッセージを永続化する賢明な方法はありますか? できれば避けたいところです。
アップデート:
URL を保持したい理由 (およびエラー) は、current_page? を使用しているためです。ナビゲーションでアクティブな状態を設定します。したがって、フォームがエラーで送信された場合、メニューの「編集」アクションは強調表示されなくなります。