1

チュートリアルを開始するRORのガイドに従って、config /routes.rbファイルに次の関連付けがある2つのモデル(投稿とコメント)を持つブログを作成しています。

resources :posts do
  resources :comments
end

view/posts/show.html.erbそのため、コメントとコメントフォームは、表示上の理由でブログのページに表示されます。@post, @post.comments.buildただし、次のコードスニペットで何が意味するのかを理解するのに行き詰まっています。

<h2>Add a comment:</h2>
<%= form_for([@post, @post.comments.build]) do |f| %>
  <div class="field">
    <%= f.label :commenter %><br />
    <%= f.text_field :commenter %>
  </div>
  <div class="field">
    <%= f.label :body %><br />
    <%= f.text_area :body %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

また、リファクタリング中に、作成者はコメントを表示するコードをview/comments/_comment.html.erbパーシャルに移動し、それをview/posts/show.html.erb使用してレンダリングしました

<%= render @post.comments %>

これによりapp/views/comments/_comment.html.erb、コレクション内のコメントごとにパーシャルインが1回レンダリングされ@post.commentsます。renderメソッドは@post.commentsコレクションを反復処理するときに、各コメントをパーシャルと同じ名前のローカル変数に割り当てます。この場合、コメントはパーシャルで表示できるようになります。

Q:railsは、上記のコード行からコメントを表示するために、パーシャル名とパーシャルに渡される変数をどのように推測しますか?

また、上記のブログアプリケーションに関して、次のステートメントが何を意味するのか説明していただけますか。参照:http://guides.rubyonrails.org/getting_started.html

The @post object is available to any partials rendered in the view because we defined it as an instance variable.
4

1 に答える 1

3

最初の質問。

どういう[@post, @post.comments.build]意味ですか?

基本的に、これはあなたのフォームで生成されるものをインスタンス化します。、@postそしてそれも構築され@post.commentsます。しかし、これは不要のようです。次の方法で同じことを達成できると思います。

<%= form_for @post do |f| %>

フォーム自体がフォームを作成しない限り、まったく同時にコメントを書く機会も与えられます。

2番目の質問。

パーシャルが機能する方法は、オブジェクトと同じ名前である限りです。あなたの場合_comment.html.erb、あなたのモデルと同じ名前Commentです。したがって、Railsは自動的にそれがあなたが探しているものであると想定します。

パーシャルの名前を別の名前に変更する場合は、より具体的に次のように記述します。

<%= render :partial => 'comments/sweet_comment_partial_name', :collection => @post.comments %>

アップデート

ああ、私はあなたがどのような形を指しているのかわかりませんでした。これは特にこれをインスタンス化します:

[@post, @post.comments.build]

コメントモデルを参照しています。しかし、コメントの親は@postです。そのため、具体的に参照しているコメントモデルは、の子であり@post、それに関連付けられているコメントの配列に基づいて構築または追加されます@post

于 2012-06-30T21:19:44.827 に答える