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
用于呈现视图模板,并不实际调用操作。要呈现的视图的名称可以是 string
或 symbol
.
render 'new' # renders new.html.erb
render :new # renders new.html.erb
因此,在您的情况下,当执行 create
操作中的 render :new
时,控制器所做的就是呈现传递给实例变量 @foo
的 new.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
然后试图从另一个控制器访问它......那永远不会奏效。
当我使用脚手架生成 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
用于呈现视图模板,并不实际调用操作。要呈现的视图的名称可以是 string
或 symbol
.
render 'new' # renders new.html.erb
render :new # renders new.html.erb
因此,在您的情况下,当执行 create
操作中的 render :new
时,控制器所做的就是呈现传递给实例变量 @foo
的 new.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
然后试图从另一个控制器访问它......那永远不会奏效。