Ruby on rails 如何进行渲染:编辑调用在地址栏中显示/编辑

Ruby on rails 如何进行渲染:编辑调用在地址栏中显示/编辑,ruby-on-rails,Ruby On Rails,在my Rails应用程序中my preferences controller的更新操作中,如果验证/保存等过程中出现任何错误,则会调用: format.html{render:edit} 没有什么不寻常的地方-但是,当点击此代码时,浏览器中的地址会更改,并丢失URL中的/edit 例如: 首先,我的浏览器显示我在页面上的以下地址: 但是,一旦检测到错误并调用渲染,中的地址将更改为 我不能说我以前注意到过这种行为——但是有没有办法强迫/edit停留在URL的末尾?如果没有/edit,它将有效

在my Rails应用程序中my preferences controller的更新操作中,如果验证/保存等过程中出现任何错误,则会调用:


format.html{render:edit}

没有什么不寻常的地方-但是,当点击此代码时,浏览器中的地址会更改,并丢失URL中的/edit

例如:

首先,我的浏览器显示我在页面上的以下地址:

但是,一旦检测到错误并调用渲染,中的地址将更改为

我不能说我以前注意到过这种行为——但是有没有办法强迫/edit停留在URL的末尾?如果没有/edit,它将有效地显示显示显示页面的URL(我没有用于此的模板!)

非常感谢,,
Ash

您可以
重定向到编辑页面,并使用
flash
跟踪模型,而不是调用
渲染

def update
  # ...
  if !@model.save # there was an error!
    flash[:model] = @model
    redirect_to :action => :edit
  end
end
然后在
edit
操作中,您可以从
flash[:model]
重新加载值,即:

def edit
  if flash[:model]
    @model = flash[:model]
  else
    @model = ... # load model normally
  end
end
更新: 正如下面所评论的,我认为当我写这个答案时,我试图提供一种方法来更新URL(需要重定向)和保留模型的更改属性,这就是为什么模型存储在flash中。然而,将模型粘贴到flash中是一个非常糟糕的主意(在Rails的更高版本中,它将被反序列化),RESTful路由实际上并不需要使URL包含
edit

通常的模式是在模型已经在内存中的情况下渲染编辑操作,并放弃使用“理想”URL:


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

只需重定向到编辑路径并将模型传递到rails路径帮助器,如下所示:

def update
  if @model.update_attributes(updated_params)
    // Success
  else
    redirect_to edit_model_path(@model), flash: { error: "Could not update model" }
  end
end

这将保留您的闪存,将您重定向到正确的路径并重新加载您的模型。

太棒了!谢谢我一直试图使用重定向到,但丢失了flash消息!这似乎是一种奇怪的行为。为什么Rails会去掉/edit?如果您使用respond_格式化format.html{redirect_to:action=>:edit},那么在flash中传递模型似乎非常混乱。如果要重定向到正确的编辑路径,当模型应自动重新加载时,为什么需要重新加载?请参阅下面的解决方案。当您在创建操作中使用
render:edit
(或
render:new
)且用户点击“重新加载”时,您将在第一个实例中获得显示页面,在第二个实例中获得路由错误。它还将丢失用户的所有编辑,导致用户体验非常不友好。遗憾的是,您不能同时获得更改和相同的url,这对用户体验也不好。每当用户出现错误并在浏览器中手动刷新页面时,他不再进行编辑,而是在显示操作中,即。。。悲哀的
def update
  if @model.update_attributes(updated_params)
    // Success
  else
    redirect_to edit_model_path(@model), flash: { error: "Could not update model" }
  end
end