我试图理解编写代码行的原因 @example = Example.new
两次。
根据下面的答案,似乎模型对象是两次实例化的,但我不明白为什么我们需要实例化新方法的对象。
rails:"新事物"如何行动称为"创建"动作?
def new
@example = Example.new
end
def create
@example = Example.new(example_params)
if @article.save
redirect_to @example
else
render 'new'
end
end
您无法使用空白对象,因为在这种情况下,您的视图将无法为example
构建表单。通常,人们在这样做时正在建造形式并使用轨道形式的构建器,需要正确的模型对象(在这种情况下为@example
),否则形式构建器永远不会知道该模型对象的属性必须构建。
<%= form_for @example do |f| %>
Name: <%= f.text_field :name %>
<% end %>
在上面,没有@Example,form_for
将无法确定它必须转到Example
的create
操作。它也无法识别name
字段。
如果要从new
操作中删除@example = Example.new
,则必须自行构建表格。但是,遵循惯例,不建议进行。
<%= form_tag('/examples') do %>
Name: <= text_field_tag :name %>
<%= submit_tag 'Submit' %>
<% end %>
在新方法中,当我们使用 @example = Example.new
时,我们的初始化当前模型的空白对象和 @example
用于在视图中绑定表单。
<%= form_for @example do |f|%>
如果您看到上线的HTML,它将就像
<form accept-charset="UTF-8" action="/examples" method="post">
@example
在新的基本上绑定模型属性
我们用户@example = Example.new(example_params)
再次使用表单值初始化对象,即用户在表单中输入的值并提交。
您可以访问以下链接以了解更多http://guides.rubyonrails.org/routing.html
@example
在这里未实例化两次。这是两个不同的动作。每次称为其中一个时,都会创建控制器类的新实例。因此@example
仅属于该实例。
您对#new
实例化@example
,以便在视图中可用。Rails通过复制来自动从控制器操作中共享实例变量及其相应的视图。您可以在控制器中进行实例化,因为它是控制器工作的一部分。这样,您就会有一个很好的关注点:视图不需要打扰创建变量,而只需要呈现它们。
您当然可以这样做:
##controller
def new
end
##new.html.erb
<%example = Example.new%>
<%=form_for example do |f| %>
##code omitted for brevity
它将起作用。但这不是一个好习惯,因为您在视图中混合了不同的逻辑。