2012-04-19 12 views
1

​​を使って作業していますが、パーシャルとコレクションで問題が発生しました。Rails 3ネストしたパーシャル、コレクション、ローカル(レールチュートリアル第2版:第10章、エクササイズ5)

第10章、演習5の状態: "パーシャルを使用すると、リスト10.46とリスト10.47の削除リンクの重複がなくなります。

リスト10.46:アプリ/ビュー/共有/ _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, 
            confirm: "You sure?", 
            title: feed_item.content %> 
    <% end %> 
</li> 

私のアプローチでした:アプリ/ビュー/マイクロポスト/ _micropost.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, 
            confirm: "You sure?", 
            title: micropost.content %> 
    <% end %> 
</li> 

は10.47がリストこのファイルを作成する 共有/ _item_delete_link.html.erb

<%= link_to "delete", item, method: :delete, 
           confirm: "You sure?", 
           title: item.content %> 

そして、このようなオリジナルのパーシャルでこの部分を使用:10.46リスト

:アプリ/ビュー/マイクロポスト/ _micropost.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) %> 
    <%= render partial: 'shared/item_delete_link', collection: @microposts, as: :item %> 
    <% end %> 
</li> 

10.47リスト:アプリ/ビュー/共有/ _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) %> 
    <%= render partial: 'shared/item_delete_link', collection: @feed_items, as: :item %> 
    <% end %> 
</li> 

これはすべての私のテストに合格するようになったので、私は、ブラウザでそれを確認するまで、私はそれが働いていたと思った: http://grab.by/daUk

_item_delete_link部分集合ごとにコレクション全体が再びレンダリングされていましたが、親部分で使用されていた元のコレクションのローカル変数を渡すだけでした。

レンダリングにはlocals: { }object:オプションを使用しようとしましたが、運がなかった。

誰でも回答が分かりますか?ありがとう!

+0

ああ信じています<%=レンダリング部分: 'sh 'item:@ feed_item'と 'item:@micropost'を実行してみました。 '、しかし、私は、オブジェクトではなく、ローカル変数を渡す必要がありました。 duh –

+0

'locals:'を使って正確なコードを表示してください。 Thx –

+0

ちょうどそれをありがとう! –

答えて

5

地元の部分をネストされた部分に渡し、コレクションを再レンダリングしません。これを行うには、locals: { symbol: :original-local }オプション(新しいRubyハッシュ構文を使用して記述)を使用する必要があります。

部分... アプリ/ビュー/ 10.46リスト/ _item_delete_link.html.erb

<%= link_to "delete", item, method: :delete, confirm: "You sure?", 
     title: item.content %> 

共有:アプリ/ビュー/マイクロポスト/ _micropost

だから、答えはこのする必要があります.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) %> 
    <%= render partial: 'shared/item_delete_link', locals: { item: micropost } %> 
    <% end %> 
</li> 

リスト10.47:app/views/shared/_feed_item.html。

<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) %> 
    <%= render partial: 'shared/item_delete_link', locals: { item: feed_item } %> 
    <% end %> 
</li> 

ERB

はPARTIALへの追加: それはこのビットリファクタリングとも部分的に条件付きのユーザーを含めることが可能です。そして、レンダリングする呼び出しは、同様のユーザーに渡す必要があります

アプリ/ビュー/共有/ _item_delete_link.html.erb

<% if current_user?(item.user) %> 
<%= link_to "delete", item, method: :delete, 
     confirm: "You sure?", title: item.content %> 
<% end %> 

:だから、あなたはに部分的に行うことができます。だから、 リスト10.46:アプリ/ビュー/共有/ _feed_item.html.erb

<%= render partial: "shared/item_delete_link", 
      locals: { item: feed_item, user: @user } %> 

別の質問:アプリ/ビュー/マイクロポスト/ _micropost.html.erb

<%= render partial: "shared/item_delete_link", 
      locals: { item: micropost, user: @user } %> 

は10.47リスト ローカル変数に対して、オブジェクトを渡すタイミングについて混乱します。 この場合、ローカル変数micropostfeed_itemではなく、インスタンス変数@userを渡さなければなりませんでした。

これはなぜこの場合に当てはまるのですか?

0

次わずかに少ない冗長実装は(Railsの3.2.14に)私のために働いていない:

(後世のためにここに記載されている)部分に対する変更:次へ

<% if current_user?(item.user) %> 
<%= link_to "delete", item, method: :delete, 
     confirm: "You sure?", title: item.content %> 
<% end %> 

変更 -

アプリケーション/ビュー/マイクロポスト/ _micropost.html.erb:

<%= render 'shared/micropost_delete_link', :item => micropost %> 

本のアプリ/ビュー/共有/ _feed_item.html.erb:

<%= render 'shared/micropost_delete_link', :item => feed_item %> 

  1. 部分的
  2. この方法であると仮定されるレンダリングするために、第1の引数として文字列を渡します``と<%:地元の人々、 '共有/ item_delete_link':{micropostアイテム}%=が部分的にレンダリング> `:ローカル変数を渡すとのみ3をレールに適用されるのは、私はちょうどそれを考え出し、Rails 4 may require local variables to be passed via the locals hash