我阅读了关于关联的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;之后在列表部分内部,然后集合工作,但结束标签最终导致问题。我不知道如何解决这个问题。
答案 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的无效字符。