为什么Rails Judvention是写@Example = example.new两次,一次是在新的,然后在创建方法



我试图理解编写代码行的原因 @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将无法确定它必须转到Examplecreate操作。它也无法识别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

它将起作用。但这不是一个好习惯,因为您在视图中混合了不同的逻辑。

最新更新