Kre*_*eki 9 ruby-on-rails ruby-on-rails-3
我有2个动作 - 编辑和更新."编辑"中的表单将值提交给"更新"操作.当保存模型失败时,我渲染编辑teplate,用户看到错误,并且字段预先填充了之前填充的内容.有一个巨大但对我来说 - 在用户浏览器中的URL面板中有/ user/update,即使(因为)我渲染了编辑模板.我可以通过在update操作中将一些参数传递给render方法来改变它吗?我不希望用户看到除了编辑之外还有任何(更新)操作.可能吗?
小智 6
以下是第三种方法:
在您的routes.rb中
resources :users
match 'users/:id/edit' => 'users#update', :via => :put, :as => :put_user
Run Code Online (Sandbox Code Playgroud)
在您的视图中(例如edit.html.erb)
<%= form_for @user, :url => put_user_path do |f| %>
...
<% end %>
Run Code Online (Sandbox Code Playgroud)
在您的控制器中(例如users_controller.rb)
def update
@user = User.find(params[:id])
if @user.update_attributes(params[:user])
...
else
render 'edit'
end
end
Run Code Online (Sandbox Code Playgroud)
有两种方法可以解决这个问题:
1) 从更新操作重定向回编辑操作,而不仅仅是渲染模板,并传递要用于填充正在编辑的对象的错误消息和属性。这将导致 URL 为 /user/edit。
默认更新
@user = User.find(params[:id])
如果@user.update_attributes params[:user]
...
别的
redirect_to edit_user_path(@user, :messages => @user.errors)
结尾
结尾
2) 发布到编辑操作而不是更新操作,并完全删除更新操作。你可以使用 request.post 吗?在您的编辑操作中检查请求是否是发布或获取请求,然后使用相同的函数定义执行更新和编辑操作。
默认编辑
@user = User.find(params[:id])
如果请求.post?
@user.update_attributes 参数[:用户]
...
别的
...
结尾
结尾
注意:请记住,您永远无法真正对客户端隐藏 POST 操作,因为他们始终可以查看您的源代码并查看您在表单中发布的操作。
| 归档时间: |
|
| 查看次数: |
7909 次 |
| 最近记录: |