ruby-on-rails - 如何进行渲染 :edit call show the/edit in the address bar

标签 ruby-on-rails

在我的 Rails 应用程序中我的首选项 Controller 的更新操作中,如果验证/保存等中有任何错误,则调用:
format.html { render :edit }
那里没有什么太不寻常的地方——但是,当这个代码被点击时,浏览器中的地址会改变并丢失 URL 中的/edit。

例如:

首先,我的浏览器显示我在以下地址的页面上:http://localhost:3000/preferences/1/edit

但是,一旦检测到错误并调用渲染,地址将更改为 http://localhost:3000/preferences/1

我不能说我以前曾经注意到过这种行为 - 但是有没有办法强制/edit 留在 URL 的末尾?没有/edit 它有效地显示了显示页面的 URL(而且我没有模板!)

非常感谢,

最佳答案

而不是调用 render , 你可以 redirect_to编辑页面,并使用 flash跟踪模型:

def update
  # ...
  if !@model.save # there was an error!
    flash[:model] = @model
    redirect_to :action => :edit
  end
end

然后在 edit您可以从 flash[:model] 重新加载值的操作, IE:
def edit
  if flash[:model]
    @model = flash[:model]
  else
    @model = ... # load model normally
  end
end

更新:

正如下面评论的那样,我认为当我写这个答案时,我试图提供一种方法来更新 URL(这需要重定向)并保留模型的更改属性,这就是模型存储在闪存中的原因。但是,将模型粘贴到 flash 中是一个非常糟糕的主意(在以后的 Rails 版本中,无论如何它只会被反序列化),并且 RESTful 路由实际上并不需要使 URL 包含 edit。 .

通常的模式是只使用内存中的模型渲染编辑操作,并放弃“理想”的 URL:
def update
  # Assign attributes to the model from form params
  if @model.save
    redirect_to action: :index
  else
    render :edit
  end
end

或者,如果最好使用“理想” URL,并且您不关心维护未通过验证的更改属性,请参阅@jamesmarkcook 的答案。

关于ruby-on-rails - 如何进行渲染 :edit call show the/edit in the address bar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3348920/

相关文章:

ruby-on-rails - 如何在 Rails 中设置 session 变量?

javascript - 获取特定字段的 json 数据并存储在文件中

ruby-on-rails - Rails3.1 中的测试非常慢。有某种解决方案可以更快地加载测试吗?

ruby-on-rails - 如何从 Ruby on Rails 上的路径发现 Controller 名称和方法?

ruby-on-rails - 如何使用 Formtastic 更改标签的类别

ruby-on-rails - 如何从 Puma 获取隔离线程信息

ruby-on-rails - rails - 禁用选择标签

ruby-on-rails - 使用 Rack::Attack 防止快速登录尝试

ruby-on-rails - 在 ruby​​ 中解析 json 以进行排序、过滤等

jquery - 如何使用 Rails 找到 JQuery 自动完成匹配项时显示响应