2016-09-17 72 views
0

当我使用一个支架来生成一个Foo模型/控制器,我的控制器具有默认创建的行动,将render :new如果@foo.save返回false。渲染如何处理实例变量?

会发生什么事我@foo对象时,我render :new

我的股票new.html.erb视图是指@foo.errors,这让我觉得它重用从我的创建行动@foo(而不是在新的方法重新创建@foo = Foo.new一个新的对象)。这不是这种情况吗?

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

回答

1

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

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

如果你有一个'新命名空间控制器',这(不言而喻)不是相同的控制器。目前还不清楚你在做什么,但如果你在一个控制器中设置@new,然后尝试从另一个控制器访问它......这永远不会工作。

1

从文档

如果你想呈现对应于不同的模板相同的控制器内的视图中,您可以使用带有视图名渲染:

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

render 'new' # renders new.html.erb 

render :new # renders new.html.erb 

所以,在你的情况下,执行时render :newcreate行动,所有的控制器并为呈现new.html.erb传递实例变量@foocreate行动。这就是为什么当保存记录失败时,您可以在视图中看到@foo.errors.full_messages,因为@foo引用了无效对象。

总之,render只是使您指定和不调用一个动作重新创建对象的模板。

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

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

希望这有助于部分2.2.4。