我的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和其他互联网部分,但没有找到任何适合我需要的东西。有一两个这样的主题有类似的问题,但它们都使用基于flash和hacky重定向的解决方案,这不是我想要的。

最佳答案

您需要设置如下路径:

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

那么表单应该声明如下:
<%= form_for @user, url: settings_path %>

在您的控制器中,确保您按如下方式调用render
render action: "edit"

10-04 21:30
查看更多