首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >呈现其他控制器的模板(Ruby on Rails)

呈现其他控制器的模板(Ruby on Rails)
EN

Stack Overflow用户
提问于 2009-12-24 06:59:46
回答 4查看 1.3K关注 0票数 2

我正在构建一个样例站点来熟悉RoR。我一直在阅读“使用Rails进行敏捷Web开发”这本书,现在我正在试验并使用它作为参考,但是我还没有找到问题的答案。

我有两个感兴趣的模型,一个是超市连锁店,另一个是超市。显然,一家连锁超市有一大堆超市。我想要做的是获得一个超市连锁店的基本"show“页面,以显示属于它的超市的列表。

我也不想重复(因为这显然是一件非常糟糕的事情),所以我想我可以使用"render“将超市的index.html.erb插入到supermarket Thing/show.html.erb页面中,如下所示:

代码语言:javascript
运行
复制
<%= render :template => 'supermarkets/index' %>

然而,这在页面上产生了零输出。

我的下一个方法是将其部分化为:

代码语言:javascript
运行
复制
<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>

然后使用:

代码语言:javascript
运行
复制
<% @supermarkets = Supermarket.all %>

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

把它放在超市连锁店的展示页面上。

我想知道的是,这是不是一个好的做法。当我想要显示的是超市控制器的"index“操作的确切结果时,初始化一个变量以供partial使用,对我来说似乎很奇怪。评论?

请要求任何必要的澄清。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-12-24 07:03:07

相反,您可以这样做

代码语言:javascript
运行
复制
<%= render :partial => 'supermarket', :collection => Supermarket.all, :as => :s %>

partial将为每个超市调用一次,变量名为s

票数 0
EN

Stack Overflow用户

发布于 2010-01-04 13:43:05

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

下面是如何对这两个部分使用相同的部分supermarkets/_supermarket.html.erb。partial将使局部变量supermarket可用。

代码语言:javascript
运行
复制
# supermarketchain/show.html.erb
<%= render :partial => "supermarkets/supermarket", :collection => @supermarketchain.supermarkets %>

# supermarkets/show.html.erb
<%= render :partial => "supermarket", :object => @supermarket %>
票数 1
EN

Stack Overflow用户

发布于 2009-12-24 07:46:28

我自己也在努力解决这个问题,但发现它并不是一种真正支持的渲染部分参数的方法,而且由于我通常信任Rails开发人员的约定,所以我认为这可能不是一个好主意。

我不认为在其中使用模板会起作用,你可以使用render_to_string,但这看起来有点老土,可能会在未来给你带来更多的麻烦。

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

代码语言:javascript
运行
复制
def index
  @supermarkets = Supermarket.all
end

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

代码语言:javascript
运行
复制
<%= render @supermarkets %>

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

代码语言:javascript
运行
复制
<%= supermarket.name %><br />
<%= supermarket.address %>

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1955807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档