2017-03-09 59 views
0

爲什麼控制器中的新動作需要實例變量@article初始化?我已經測試過,在新操作中沒有實例變量的情況下,記錄可以很好地保存到數據庫中的表中。爲什麼控制器中的新操作需要初始化實例變量?

class ArticlesController < ApplicationController 
    def new 
    @article = Article.new 
    end 

    def create 
    @article = Article.new(article_params) 

    if @article.save 
     redirect_to @article 
    else 
     render 'new' 
    end 
    end 
end 
+0

你是什麼意思「實例變量需要初始化」? – Fredius

+0

如果你不需要它,請將其移除。如何檢查是否需要它?,只需轉到'articles'文件夾中的'new.html.erb'模板並看到它。在你的'new.html.erb'模板中,你可能會初始化一個新的'Article'實例,這就是你不需要這個變量的原因之一。 – fanta

+0

如果你想使用表單助手,你需要它,否則你可以跳過初始化 –

回答

3

創建模型的空實例的點是圍繞你的新觀點股不少視圖代碼與編輯視圖,因此需要在模型上工作的想法。

例如,在許多情況下,新的和編輯頁面幾乎完全相同。您的文章的新頁面可能允許用戶輸入姓名,作者和發佈日期。現在用戶可能希望編輯這些信息,並且您可能會向他們顯示完全相同的三個文本字段以編輯姓名,作者和發佈日期。爲了幹這個(不要重複自己),你可以將該表單合併到單個視圖中。你最終會與看法是這樣的:

# new.html.haml 
New Article 
= render :partial => "form" 

# edit.html.haml 
Edit Article 
= render :partial => "form" 

# _form.html.haml 
= text_field_tag "title", @article.title 
= text_field_tag "author", @article.author 
= text_field_tag "publishing_date", @article.publishing_date 

顯然,當您正在編輯現有的文章,你需要從數據庫中提取數據,然後使用它的屬性來填寫表格。很多人做的是在新頁面上重複使用該表單,但現在表單期望有一個@article變量,所以程序員在其new操作中初始化一個空表單。

這也有助於如果您的表單部分需要在您的對象上調用方法。例如:

# article.rb 
def published_today? 
    return (self.publishing_date.to_date == Date.today) 
end 

# _form.html.haml 
- if @article.published_today? 
    %strong New! 

但是如果你的新的編輯頁面不共享相同的代碼,你的新頁面不需要一個空模型實例創建的,則不用麻煩了,那也沒關係。

+1

偉大的解釋!我來看到形式部分與此有關。 –

+0

@SookieJ不客氣! – MrDanA

相關問題