2017-09-14 67 views
0

我想了解两次编写代码行 @example = Example.new的原因。为什么Rails约定会在new中写入@example = Example.new两次,然后在create方法中写入一次?

根据下面的答案,似乎模型对象被实例化了两次,但我不明白为什么我们需要为新方法实例化对象。

Rails : How does "new" action called "create" action?

def new 
    @example = Example.new 
    end 

    def create 
    @example = Example.new(example_params) 

    if @article.save 
     redirect_to @example 
    else 
     render 'new' 
    end 
    end 

回答

2

您不能使用空白对象,因为在这种情况下,您的视图将无法为example生成表单。通常人们在创建窗体时使用Rails窗体构建器,需要正确的模型对象(在这种情况下为@example),否则form builder将永远不知道它必须构建的模型对象的属性。

<%= 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 %> 
1

在新方法,当我们使用我们@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

+0

我不明白为什么你不能在创建方法的新方法中使用空白对象。由于两次初始化对象似乎是多余的。 – Blaze

+0

@因为行动不同,所以不要两次。 –

0

@example不是实例这里两次。这是两种不同的行为。每次调用其中一个时,都会创建一个控制器类的新实例。所以@example只属于那个实例。

您实例化@example#new,以便它可以在视图中可用。 Rails会自动将控制器操作中的实例变量与相应的视图复制,然后自动共享它们。你在控制器中进行实例化,因为它是控制器工作的一部分。通过这种方式,您可以很好地区分问题:视图不需要为创建变量而烦恼,只需要展示它们即可。

当然,你可以这样来做:

##controller 
def new 
end 

##new.html.erb 
<%example = Example.new%> 
<%=form_for example do |f| %> 
##code omitted for brevity 

,它会工作。但是,在视图中混合不同的逻辑时,这不是一个好习惯。

相关问题