2017-03-09 6 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'の新しいインスタンスを初期化している可能性があります。これは、その変数を必要としない理由の1つです。 – fanta

+0

フォームヘルパーを使用したい場合は、それを必要とするか、そうでなければ初期化をスキップすることができます –

答えて

3

モデルの空のインスタンスを作成するためのポイントは、あなたの新しいビューは、あなたの編集ビューでビューのコードの多くを共有するという考えに基づいていて、これで動作するようにモデルを必要としています。

たとえば、多くの場合、新しいページと編集ページはほぼ同じです。あなたの記事の新しいページは、ユーザーが名前、著者、および出版日を入力できるようにすることができます。これで、ユーザーはこの情報を編集したいと思うかもしれません。名前、著者、出版日を編集するための3つのテキストフィールドを正確に表示するでしょう。

これをやり直すには(自分自身を繰り返してはいけません)、そのフォームを1つのビューの一部分にまとめることができます。あなたはこのような景色で終わるでしょう:

# 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

関連する問題