2017-09-14 64 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 

,它會工作。但是,在視圖中混合不同的邏輯時,這不是一個好習慣。

相關問題