在浏览器中渲染模板并更改网址字符串?

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)


Pan*_*kos 4

有两种方法可以解决这个问题:

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 操作,因为他们始终可以查看您的源代码并查看您在表单中发布的操作。

  • 在执行选项 1 时,我最终得到类似 `articles/1/edit?messages=%23&lt;ActiveModel%3A%3AErrors%3A0x007f81b14c5d08&gt;` 的 URL,并且不会显示错误。 (2认同)