为什么渲染方法会在编辑后更改单个资源的路径?

问题描述 投票:4回答:3

好的,所以我有一个用户has_one模板,我想要一个页面,基本上只是模板的编辑视图。

我有:

class TemplatesController < ApplicationController
  def edit
    @template = current_user.template
  end

  def update
    @template = current_user.template
    if @template.update_attributes(params[:template])
      flash[:notice] = "Template was successfully updated"
    end
    render :edit 
 end

结束

现在'问题'就是我调用render:edit我实际上最终在/template.1而不是/ template / edit这是我所期望的。显然,如果我调用redirect_to:edit然后我会得到我期望的路径但是如果有的话我会丢失对象错误。

有一个更好的方法吗?

谢谢!!

ruby-on-rails controller render ruby-on-rails-3
3个回答
2
投票

通常在编辑/更新操作对中,只有在出现错误时才会从更新中重新呈现编辑,相应地设置闪存。如果你已经在模板/ 1 /编辑(这是我期望的),那么网址逻辑上不会改变,因为你告诉浏览器只是渲染你发送它的文本。这是预期的行为。如果您成功更新,那么您可以重定向到显示或索引或者您需要从哪里开始,并且闪存将保留通知文本(这是闪存的用途),即使模型不会。请注意,对于渲染操作,您需要使用Flash.now,以便消息不会在下一次重定向时保留。

def update
  @template = current_user.template
  if @template.update_attributes(params[:template])
    flash[:notice] = "Template was successfully updated"
    redirect_to(@template)
  else 
    flash.now[:error] = @template.errors[:base]
    render :edit
  end
end

1
投票

如果您使用的是单一资源,则需要在路由中使用resolve。见this in the Rails Guides

resource :geocoder
resolve('Geocoder') { [:geocoder] }

-2
投票

在我看来,你不能松散模板对象(在编辑动作上),因为你从用户模型中获取它

render edit_template_patch(@template)

你会得到template/:id/edit例如。 template/1/edit

© www.soinside.com 2019 - 2024. All rights reserved.