3

Railsアプリケーションに次のルートがあります

match '/settings', to: 'Users#edit', as: 'settings'

および対応するコントローラーコード

def edit
  @user = current_user
end

def update
  correct_user
  @user = User.find(params[:id])
  if !@user.authenticate(params[:old_password])
    flash[:error] = 'Old password did not match'
    redirect_to settings_path
  elsif @user.update_attributes(params[:user])
    flash[:success] = "Settings updated"
    redirect_to settings_path
  else
    render 'edit'
  end
end

私の編集ページは現在、パスワード変更ページにすぎません。アクセスする/settingsと、除外したいページが表示されます。私redirect_to settings_pathが、URLが残っているとき/settings、それは私が望む振る舞いです。

私のeditテンプレートには、オブジェクトエラーを処理してページにレンダリングするためのコードがあります。の場合render 'edit、オブジェクトエラーが発生した場合にこのコードがトリガーされます。ただし、ページにリダイレクトすると、コードが表示されません。だから私render 'edit'はエラーを見るために電話する必要があります。

ただし、呼び出すrender 'edit'とURLがに変更されます/users/:id/edit。これはまさに私が望まないことです。/settingsを呼び出した後もURLを残したいのですがrender 'edit'。どうすればこれを達成できますか?

注:私はすでにインターネットのSOやその他の部分を検索しましたが、自分のニーズに合ったものは見つかりませんでした。同様の問題を抱えるSOトピックが1つか2つありますが、それらはすべて、フラッシュとハッキーなリダイレクトベースの回避策を使用しています。これは私が望んでいることではありません。

4

2 に答える 2

6

次のようにルートを設定します。

match 'settings': 'users#edit', via: :get
match 'settings': 'users#update', via: :put

次に、フォームは次のように宣言する必要があります。

<%= form_for @user, url: settings_path %>

renderコントローラで、次のように呼び出していることを確認してください。

render action: "edit"
于 2012-07-13T20:16:42.607 に答える
1

おそらくlink_to、ビューに問題があります。1つは、を使用する代わりに、古いスタイル:controller:action引数を別々に使用してsettings_pathいます。

同じコントローラーとアクションのペアへのルートが2つある場合は、最初に定義されたルートが優先されることに注意してください。最初にカスタムルートを定義して、デフォルトで使用されるようにします。

于 2012-07-13T20:15:09.440 に答える