msc*_*ert 2 ruby ruby-on-rails ruby-on-rails-3
我的rails应用程序中有以下路由
match '/settings', to: 'Users#edit', as: 'settings'
Run Code Online (Sandbox Code Playgroud)
和相应的控制器代码
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
Run Code Online (Sandbox Code Playgroud)
我的编辑页面现在只是一个密码更改页面,当我访问时,/settings我会看到除了我以外的页面.当我redirect_to settings_path,网址仍然存在/settings,这是我想要的行为.
在我的edit模板中,我有代码来处理对象错误并在页面上呈现它们.何时render 'edit,如果存在对象错误,则触发此代码.但是,如果我重定向到页面,则代码不存在.所以我需要打电话render 'edit'来查看错误.
但是,调用render 'edit'导致URL更改为/users/:id/edit,这正是我不想要的.我希望/settings在通话后保留URL render 'edit'.我怎样才能做到这一点?
注意:我已经搜索了SO和互联网的其他部分,但没有发现任何适合我的需求.有一个或两个SO主题有类似的问题,但他们都使用闪烁和hacky重定向的解决方法,这不是我想要的.
您可能希望像这样设置路线:
match 'settings': 'users#edit', via: :get
match 'settings': 'users#update', via: :put
Run Code Online (Sandbox Code Playgroud)
然后表单应该声明如下:
<%= form_for @user, url: settings_path %>
Run Code Online (Sandbox Code Playgroud)
在你的控制器中,确保你这样打电话render:
render action: "edit"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2643 次 |
| 最近记录: |