2

我正在构建一个示例站点来熟悉 RoR。我在一定程度上遵循了“Agile Web Development with Rails”一书,现在我正在试验并将其用作参考,但是我无法找到我的问题的答案。

我有两种感兴趣的模式,一种是连锁超市,另一种是超市。显然,连锁超市有一堆超市。我要做的是获取单个连锁超市的基本“显示”页面,以显示属于它的超市列表。

我也不想重复自己(因为显然这是一件非常糟糕的事情),所以我想我可以使用“渲染”将超市的 index.html.erb 插入到超市链/show.html.erb 页面中,就像这样:

<%= render :template => 'supermarkets/index' %>

但是,这在页面上产生了零输出。

我的下一个方法是使这个部分:

<div id="supermarket-list">
  <h1><%= I18n.t "supermarket.title" %></h1>

  <table>
    <% for s in @supermarkets %>
    <tr class="<%= cycle('list-line-odd', 'list-line-even') %>">
        <td> 
            <%= s.supermarketchain.name %>
        </td>
        <td>
            <%= s.address %>
        </td>
        <td class="list-actions">
            <%= link_to I18n.t("general.show"), s%> <br/>
            <%= link_to I18n.t("general.edit"), edit_supermarket_path(s) %> <br />
            <%= link_to I18n.t("general.delete"), s, :confirm => I18n.t("general.confirmation"), :method => :delete %>
        </td>
    </tr>
    <%end%>
  </table>
</div>

然后使用:

<% @supermarkets = Supermarket.all %>

<%= render :partial => 'supermarkets/supermarket' %>

将其插入超市连锁店的展示页面。

我想知道这是否是一个好习惯。在我看来,初始化一个供部分使用的变量很奇怪,而我想要显示的是超市控制器的“索引”操作的确切结果。注释?

请要求任何需要的澄清。

4

4 回答 4

1

在 Rails 中渲染来自其他控制器的部分是非常好的。通常,如果一个部分并不真正属于任何一个特定的控制器,它就会被放入app/views/shared. 在这种情况下,尽管我认为将部分保留在超市控制器中是有意义的。

以下是如何supermarkets/_supermarket.html.erb为两个部分使用相同的部分。部分将具有可用的局部变量supermarket

# supermarketchain/show.html.erb
<%= render :partial => "supermarkets/supermarket", :collection => @supermarketchain.supermarkets %>

# supermarkets/show.html.erb
<%= render :partial => "supermarket", :object => @supermarket %>
于 2010-01-04T05:43:04.737 回答
0

好的,如果我做对了,你有一个连锁店列表,每个连锁店都有一个超市列表,对吧?你有两个模型之间的关联设置吗?因为如果你有的话,那只会简化事情。在这种情况下,假设您将模型从“supermarketchains”重命名为“chain”(清除任何混淆)。您可以像这样关联模型>

has_many :超市

并在超市模式中。

属于_to:链

从那里开始,这只是一个循环问题,例如:

<% if chain.supermarkets.count > 0 %>

#Do stuff.

<% end %>

也就是说,如果您没有设置控制器来提取该信息,则可能需要额外的工作。

于 2009-12-24T00:25:57.760 回答
0

相反,您可以这样做

<%= render :partial => 'supermarket', :collection => Supermarket.all, :as => :s %>

并且每个超市都将使用变量 name 调用部分s

于 2009-12-23T23:03:07.303 回答
0

我自己也为此苦苦挣扎,但发现它并没有真正被支持作为渲染部分的一种方式,而且由于我通常相信 Rails 开发人员的约定,我认为这可能不是一个好主意。

我不认为在其中使用模板会起作用,您也许可以使用render_to_string,但这看起来很老套,将来可能会让您更加头疼。

此外,如果要呈现集合,最好的方法是在控制器操作中设置实例变量,而不是在视图中。

def index
  @supermarkets = Supermarket.all
end

然后在视图index.html.erb中调用:

<%= render @supermarkets %>

然后它将遍历数组的每个成员,并views/supermarkets/_supermarket.html.erb为每个成员渲染,“supermarket”是部分中可用的当前成员。

<%= supermarket.name %><br />
<%= supermarket.address %>

我担心很多这些渲染的性能,但只要留意日志和时间,我认为渲染的时间与在原始视图中手动执行的时间大致相同。

于 2009-12-23T23:46:28.213 回答