render 对实例变量做了什么?

What does render do with instance variables?

当我使用脚手架生成 Foo model/controller 时,我的控制器有一个默认的创建操作,如果 @foo.save returns false.

当我 render :new 时,我的 @foo 对象会发生什么?

我的股票 new.html.erb 视图引用 @foo.errors,这让我认为它重用了我的创建操作中的 @foo(而不是创建一个在新方法中再次使用 @foo = Foo.new 的新对象)。不是这样吗?

我很担心这个,因为我想在一个新的命名空间控制器中重用这个约定(其他一切看起来都一样),但是当 render :new 发生时,我得到的 @foo 为 nil。看起来它既没有重用 Foo 对象,也没有创建新对象。所以我试图更好地理解渲染。

来自文档

If you want to render the view that corresponds to a different template within the same controller, you can use render with the name of the view:

因此,render用于呈现视图模板,并不实际调用操作。要呈现的视图的名称可以是 stringsymbol.

render 'new' # renders new.html.erb

render :new  # renders new.html.erb

因此,在您的情况下,当执行 create 操作中的 render :new 时,控制器所做的就是呈现传递给实例变量 @foonew.html.erb来自 create 动作。这就是保存记录失败时您能够在视图中看到 @foo.errors.full_messages 的原因,因为 @foo 指的是无效对象。

简而言之,render 只呈现您指定的模板,不会调用重新创建对象的操作。

您传递给 render 方法的参数不必是 action 名称。也可以传递实际视图文件的路径。

有关有效参数的完整列表,请参阅 http://guides.rubyonrails.org/layouts_and_rendering.html#using-render

中的第 2.2.4 节

希望这对您有所帮助。

render 不调用 操作 new,它只是处理文件 new.html.erb(或其他)并将其发送到浏览器。 @foo 在创建操作中创建的实例变量在呈现该模板时使用,这就是为什么如果记录无法保存,则呈现表单时用户信息仍然存在于表单字段中(假设表单设置正确)。

如果你想用一个新的 @foo 实例变量开始一个全新的请求,你可以 redirect_to :new 而不是渲染,或者只是在调用之前手动设置 @foo = Foo.new render.

如果您有 'new namespaced controller',那(不言而喻)不是同一个控制器。从问题中不清楚你在做什么,但如果你在一个控制器中设置 @new 然后试图从另一个控制器访问它......那永远不会奏效。