1

私はBeginningRails3を読んでいます。これは、記事を投稿したり、これらの記事にコメントを投稿したりできるユーザーがいるブログを作成します。彼らはこのように見えます:

    class User < ActiveRecord::Base
      attr_accessible :email, :password, :password_confirmation
      attr_accessor :password

      has_many :articles, :order => 'published_at DESC, title ASC',
                          :dependent => :nullify
      has_many :replies, :through => :articles, :source => :comments

    class Article < ActiveRecord::Base
      attr_accessible :body, :excerpt, :location, :published_at, :title, :category_ids

      belongs_to :user
      has_many :comments

    class Comment < ActiveRecord::Base
      attr_accessible :article_id, :body, :email, :name
      belongs_to :article

app / views / comments / new.html.erbには、次のように始まるフォームがあります。

    <%= form_for([@article, @article.comments.new]) do |f| %>

私の混乱は、form_for()に2つのパラメーターがある理由にあります。彼らは何に解決し、なぜ彼らは必要なのですか?

ありがとう、マイク

4

2 に答える 2

16

実際、あなたの例では、 1つのパラメーター(配列)を使用form_forして呼び出しています。ドキュメントを確認すると、必要なパラメータが表示されます。この場合、aはActiveRecordオブジェクト、または配列にすることができます(String、Symbol、またはActiveRecordのように機能するオブジェクトにすることもできます)。そして、いつそれを配列に渡す必要がありますか?form_for(record, options = {}, &proc)record

最も簡単な答えは、ネストされたリソースがある場合です。あなたの例のように、あなたはArticle has many Comments関連を定義しました。を呼び出しrake routesてルートを正しく定義すると、Railsがネストされたリソースに次のようなさまざまなルートを定義していることがわかりますarticle_comments POST /article/:id/comments

フォームタグに有効なURIを作成する必要があるため、これは重要です(Railsが自動的に作成します)。例えば:

form_for([@article, @comments])

Railsに言っていることは次のとおりです。「Railsさん、最初のパラメータとしてオブジェクトの配列を指定します。このネストされたリソースのURIを知る必要があるためです。このフォームで新しいコメントを作成したいので、次のようにします。あなたはただの最初のインスタンスです@comment = Comment.new。そしてこの記事のためにこのコメントを作成してください:@article = Article.find(:id)。」

これは、書くのとほぼ同じです。

form_for(@comments, {:url => article_comments_path(@aticle.id)})

もちろん、話にはまだまだありますが、アイデアを理解するには十分なはずです。

于 2012-05-17T08:30:50.780 に答える
1

記事にコメントするためのフォームです。したがって、Articleコメントしている(@article)と新しいCommentインスタンス(@article.comments.new)が必要です。このフォームのフォームアクションは次のようになります。

/articles/1/comments

コメントしている記事のが含まれておりid、コントローラーで使用できます。

このように省略した場合@articleform_for @article.comments.new、フォームアクションは次のようになります。

/comments

コントローラでは、コメントがどの記事に属しているかを知る方法がありません。

これを機能させるには、ルートファイルでネストされたリソースを定義する必要があることに注意してください。

于 2012-05-17T07:56:47.130 に答える