【问题标题】:Rails 3 Nested Partials, Collections, Locals (Rails Tutorial 2nd Ed : Chapter 10, Exercise 5)Rails 3 嵌套分部、集合、局部变量(Rails 教程第 2 版:第 10 章,练习 5)
【发布时间】:2012-04-30 14:06:42
【问题描述】:

通过Michael Hartl's Rails Tutorial 2nd Ed Chapter 10 Exercise 5 工作,我遇到了部分和集合的问题,并且在部分中使用了部分。

第 10 章,练习 5 指出: “使用部分,消除清单 10.46 和清单 10.47 中删除链接中的重复。”

清单 10.46:app/views/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:app/views/shared/_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>

我的方法是创建这个文件 shared/_item_delete_link.html.erb

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

然后像这样在原始部分中使用这个部分:

清单 10.46:app/views/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:app/views/shared/_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: 选项进行渲染,但没有成功。

有人知道答案吗?谢谢!

【问题讨论】:

  • 啊,刚刚想通了:&lt;%= render partial: 'shared/item_delete_link', locals: { item: micropost } %&gt;&lt;%= render partial: 'shared/item_delete_link', locals: { item: feed_item } %&gt; .... 有道理,只需要让当地人通过...我之前尝试过,但 item: @feed_item 和 @ 987654333@,但我需要传递局部变量,而不是对象。呵呵
  • 请使用locals:显示确切的代码。谢谢

标签: ruby-on-rails-3 collections partials railstutorial.org


【解决方案1】:

想通了。您希望将本地人传递给嵌套的部分,而不是重新渲染集合。为此,必须使用locals: { symbol: :original-local } 选项(使用新的Ruby 哈希语法编写)。

所以,答案应该是这样的:

部分... app/views/shared/_item_delete_link.html.erb

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

清单 10.46:app/views/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:app/views/shared/_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>

添加到部分: 可以稍微重构一下,并将用户条件包含到部分中。所以,你可以把部分变成:

app/views/shared/_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:app/views/microposts/_micropost.html.erb

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

清单 10.47:app/views/shared/_feed_item.html.erb

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

另一个问题: 我对何时传入对象而不是局部变量感到困惑。 在这种情况下,我必须传入局部变量micropostfeed_item,但传入实例变量@user

有人知道为什么在这种情况下是这样吗?

【讨论】:

    【解决方案2】:

    以下稍微不那么冗长的实现对我有用(在 Rails 3.2.14 中):

    部分没有更改(此处列出以供后代使用):

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

    对以下内容的更改 -

    apps/views/microposts/_micropost.html.erb :

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

    apps/views/shared/_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

    【讨论】:

      猜你喜欢
      • 2012-05-02
      • 2012-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多