1

現在、Michael Hartl のチュートリアル Ruby on Rails Tutorial http://ruby.railstutorial.org/ruby-on-rails-tutorial-bookを読んでいます。特定の部分変数がどこから来るのか混乱しています。彼のチュートリアルでは、ユーザーとマイクロポストを作成しています。ユーザーは自分のメイン ページ (フィードと呼ばれる) にマイクロポストを作成し、そこに投稿することができます。レイアウトはhttp://ruby.railstutorial.org/chapters/user-microposts#fig:proto_feed_mockupのようになります。User モデルは次のようになります (すべてを掲載しているわけではありません)。

class User < ActiveRecord::Base
  has_many :microposts, dependent: :destroy

  def feed
    Micropost.where("user_id = ?", id)
  end
end

Micropost モデルは次のようになります。

class Micropost < ActiveRecord::Base
  belongs_to :user
end

テキストの中で著者は、User モデル内の feed メソッドは次のように同等に記述できると述べています。

def feed
  microposts
end

なぜ同じなのですか?

次の質問はパーシャルに関するものです。ユーザーの表示ページ (show.html.erb) で、私の間違いでなければ、これで _microposts.html.erb が呼び出されます。

<%= render @microposts %>

_microposts.html.erb は次のようになります。

<li>
  <span class="content"><%= micropost.content %></span>
  <span class="timestamp">
    Posted <%= time_ago_in_words(micropost.created_at) %> ago.
  </span>
  <% if current_user?(micropost.user) %>
    <%= link_to "delete", micropost, method: :delete,
      data: { confirm: "You sure?" },
      title: micropost.content %>
  <% end %>
</li>

ここでの私の質問は、マイクロポスト変数はどこから来たのですか? このパーシャルを呼び出す @micropost 変数と同じですか?

ユーザーのホームページ (home.html.erb) で、次のような _feed.html.erb パーシャルへの呼び出しがあります。

<%= render 'shared/feed' %>

_feed.html.erb は次のようになります。

<% if @feed_items.any? %>
  <ol class="microposts">
    <%= render partial: 'shared/feed_item', collection: @feed_items %>
  </ol>
  <%= will_paginate @feed_items %>
<% end %>    

@feed_items がどこから来たのか知っています。コントローラーにセットされています。_feed_item.html.erb は次のようになります。

<li id="<%= feed_item.id %>">
  <%= link_to gravatar_for(feed_item.user), feed_item.user %>
  <span class="user">
    <%= link_to feed_item.user.name, feed_item.user %>
  </span>
  <span class="content"><%= feed_item.content %></span>
  <span class="timestamp">
    Posted <%= time_ago_in_words(feed_item.created_at) %> ago.
  </span>
  <% if current_user?(feed_item.user) %>
    <%= link_to "delete", feed_item, method: :delete,
      data: { confirm: "You sure?" },
      title: feed_item.content %>
  <% end %>
</li>

同様の質問は、変数 feed_item がどこから来て、何が含まれているのかということです。

ありがとう、マイク

4

2 に答える 2

1

わかりました、見てみましょう。これは一度にたくさんの質問ですが...

  1. 「フィード」が「マイクロポスト」に相当するのはなぜですか? これが Rails の連携です。を使用has_manyして関連付けを記述すると、Rails は関連付け名に基づいて多数のメソッドを作成します。この場合、特にメソッドhas_many :micropostsを作成するUser と言います。User#microposts

  2. render 呼び出し ( @microposts) で使用されるインスタンス変数は、おそらくコントローラー アクションで設定されます。この方法で (ActiveRecord オブジェクトの配列を使用して) render を呼び出すと、Rails はそれらのオブジェクトのクラス名と一致する名前のパーシャルを探します。この場合、それらは MicroPost オブジェクトであるため、名前付きの部分を探して_micropost、配列内のオブジェクトごとに 1 回レンダリングします。パーシャルをレンダリングするとき、パーシャルと同じ名前のローカル変数を使用して、パーシャルが関連付けられているオブジェクトを参照できます。これは_micropostパーシャルであるため、ローカルmicropost変数はレンダリングするオブジェクトを参照します。

  3. 繰り返しますが、パーシャルと同じ名前のローカル変数は、パーシャルがレンダリングしているオブジェクトを参照します。@feed_items はコレクションであり、その中のオブジェクトごとに、ローカル変数がそのオブジェクトを参照する_feed_itemパーシャルの 1 つのレンダリングを取得します。feed_item

于 2012-07-11T23:30:43.527 に答える
0
  1. ユーザーのマイクロポストは を使用して関連付けられているため、has_many内部的に、関係はユーザーの ID に基づいています。それらを「手動で」取得することは、本質的に同じことを行いますが、より多くの作業が必要です。
  2. micropostRails が作成します。@micropost「このパーシャルを呼び出す変数」の意味がわかりません。
  3. 同じ答えですが、単数形の名前ではなくテンプレート名 (IIRC) に明示的に基づいています。含まれているものの1つが@feed_items含まれています。
于 2012-07-11T23:22:53.820 に答える