我的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
时,网址仍为/settings
,这就是我想要的行为。
在我的edit
模板中,我有代码来处理对象错误并在页面上呈现它们。当render 'edit
时,如果存在对象错误,则会触发此代码。但是,如果我重定向到页面,则代码不存在。所以我需要致电render 'edit'
查看错误。
但是,调用render 'edit'
会导致网址更改为/users/:id/edit
,这正是我不想要的。我希望在致电/settings
后,网址仍为render 'edit'
。我怎样才能做到这一点?
注意:我已经搜索了SO和互联网的其他部分,但找不到任何适合我需求的内容。有一两个SO主题有类似的问题,但它们都使用闪烁和hacky基于重定向的解决方法,这不是我想要的。
答案 0 :(得分:6)
您可能想要设置这样的路线:
match 'settings': 'users#edit', via: :get
match 'settings': 'users#update', via: :put
然后表单应该像这样声明:
<%= form_for @user, url: settings_path %>
在你的控制器中,确保你这样调用render
:
render action: "edit"
答案 1 :(得分:1)
您的视图中可能有一个错误link_to
,一个分别使用旧式:controller
和:action
参数而不是settings_path
。
请记住,如果有两条到同一控制器和操作对的路由,则定义的第一条路由具有优先级。首先定义自定义路由以确保默认使用它。