2012-04-19 4 views
1

Работа через Michael Hartl's Rails Tutorial 2nd Ed Chapter 10 Exercise 5, У меня возникла проблема с частичными и коллекциями и с использованием частичного частичного.Rails 3 Вложенные частицы, коллекции, местные жители (Rails Tutorial 2nd Ed: Chapter 10, Упражнение 5)

Глава 10, Упражнение 5 гласит: «Используя частичные, устраните дублирование в ссылках удаления из листинга 10.46 и листинга 10.47».

Листинг 10,46: приложение/просмотров/microposts/_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: приложение/просмотров/общий/_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> 

Мой подход был для создания этого файла общих/_item_delete_link.html.erb

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

Тогда используйте этот частичный в оригинальных обертонов, как это:

Листинг 10,46: приложение/просмотров/microposts/_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. Еврорадио

<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

Ах, просто понял это: '<% = оказывают частичное: 'общий/item_delete_link', местные жители: {пункт: micropost}%> и' <% = сделать частичным: 'sh ared/item_delete_link ', locals: {item: feed_item}%> '.... Имеет смысл, просто нужно передать местных жителей через ... Я пробовал это раньше, но делал' item: @ feed_item' и 'item: @micropost ', но мне нужно было передать локальную переменную, а не объект. duh –

+0

Пожалуйста, укажите точный код, используя 'locals:'. Thx –

+0

Только что получил, спасибо! –

ответ

5

Выяснил это. Вы хотите передать местных жителей через вложенные частичные, а не повторно отображать коллекцию. Для этого необходимо использовать опцию locals: { symbol: :original-local } (написанную с использованием нового синтаксиса хэша Ruby).

Таким образом, ответ должен быть таким:

Парциальное ... приложение/просмотров/общий/_item_delete_link.html.erb

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

Листинг 10.46: приложение/просмотров/microposts/_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: приложение/просмотров/общий/_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', locals: { item: feed_item } %> 
    <% end %> 
</li> 

ДОБАВЛЯЯ парциальный: Можно реорганизовать это немного, а также включает в себя пользователь условного в парциальном. Таким образом, вы можете сделать частичное в:

приложение/просмотров/общий/_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: приложение/просмотров/microposts/_micropost.html.erb

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

Листинг 10.47: приложение/просмотров/общий/_feed_item.html.erb

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

ДРУГОЙ ВОПРОС: Я смущен тем, когда нужно проходить в объекте, по сравнению с локальной переменной. В этом случае мне пришлось передать локальные переменные micropost и feed_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 %> 

Изменения в следующие -

приложения/просмотров/microposts/_micropost.html.erb:

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

приложений/просмотров/общий/_feed_item.html.erb:

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

Примечание:

  1. При прохождении строку в качестве первого аргумента, чтобы сделать его предполагается частичный
  2. Этот метод прохождения локальных переменных относится только к Rails 3, я считаю Rails 4 may require local variables to be passed via the locals hash
Смежные вопросы