Rails从概念上理解关联(渲染和发布)

时间:2015-07-23 23:54:51

标签: ruby-on-rails ruby-on-rails-4 activerecord associations has-many

我阅读了关于关联的rails指南,我在SO和reddit上也经历过一系列问题,但我认为我只是在概念上没有得到关联。我有两个具体问题可以用作我正在处理的应用程序的示例,但我真的只是想了解我在做什么。

这些示例的模型:

List
        belongs_to :user
        has_many :items
Item
        belongs_to :list
        belongs_to :user
User
        has_many :lists
        has_many :items

问题1:渲染关联

我知道要在列表中显示相关的关联,我可以在我看来做这样的事情:

Users/show
    <%= render @list %>
Lists/_list 
    <ol> 
        <%= list.name %>
        <%= render list.items %>
    </ol>
Items/_item 
     <li><%= item.name %></li>

这对我来说似乎很神奇。我知道我正在调用user.list然后调用list.item,但是当有多个列表时,rails如何知道将它们与下面的相关项分开?在我看到这段代码的时候,我期待以下输出:

<ol>    
  List(a)
  List(b)
  List(c)
    <li>item(a)</li>
    <li>item(b)</li>
</ol>

我要做的是将每个列表渲染为选项卡,并将关联的项目渲染为选项卡内容。最终,我有多个不同的List类型模型,我想作为标签,并匹配多个不同的Item类型模型,以呈现为标签内容。

编辑:我摆脱了我的第二个问题,因为帖子很长,可能是一个单独的帖子。重申上述内容,如何获取上述集合并在列表中成功呈现它,其中列表是选项卡,关联的项目呈现为内容? 如果我在Users / show中使用这样的代码,我会遇到问题:

<div class="row"> 
    <div class="col s12">
         <ul class="tabs">
                  <%= render @lists %>
          </ul>
      </div>
      <%=render @items %>
</div>

列出/ _list

     <li class="tab col s3"><a href="#tab_<%=list.id%>"><%= list.name%></a></li>

Items / _item

       <div id="#tab_<%=list.id%>" class="col s12"><%= item.name %></div>

如果我尝试这个,那么我的item partial会给我一个错误,因为我无法调用list.id,它只会呈现我的所有项目,而不会将它们显示为带有列表的关联集合。如果我嵌套这个并将所有内容放在&lt;%= render lists%&gt;之后在列表部分内部,然后集合工作,但结束标签最终导致问题。我不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:0)

将集合传递给渲染与每个说法的关联几乎没有关系 - 您应该参考Layouts & Rendering guide

当您使用集合(模型实例数组)调用render时,Rails会创建一个循环并使用model name和约定来为集合的每个成员找到正确的部分。

Rails并不关心该集合来自协会。

加入:

由于List和Item之间的关系是双向的,因此您始终可以通过item.list访问项目所属的列表:

# views/items/_item.html.erb
<div id="tab_<%= item.list.id %>" class="col s12">
  <%= item.name %>
</div>

另请注意,我删除了ID开头的#,因为它是元素ID的无效字符。