Rails 从概念上理解关联(呈现和发布)
Rails Understanding Associations Conceptually (Rendering and Posting)
我阅读了关于关联的 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>
我想做的是将每个列表呈现为选项卡并将关联的项目呈现为选项卡内容。最终,我有多个不同的列表类型模型作为选项卡,并匹配多个不同的项目类型模型以呈现为选项卡内容。
编辑: 我摆脱了我的第二个问题,因为 post 很长,它可能是一个单独的 post。重申以上内容,如何获取上述集合并在列表是选项卡且关联的项目作为内容呈现的选项卡中成功呈现它?
如果我在 Users/show:
中使用这样的代码,我会 运行 遇到问题
<div class="row">
<div class="col s12">
<ul class="tabs">
<%= render @lists %>
</ul>
</div>
<%=render @items %>
</div>
Lists/_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>
如果我尝试这个,那么我的项目部分会给我一个错误,因为我不能调用 list.id,它只会呈现我的所有项目而不将它们显示为与列表相关联的集合.如果我嵌套它并将 <%=render lists %> 之后的所有内容都放在部分列表中,则集合可以工作,但结束标记最终会导致问题。我不确定如何解决这个问题。
将集合传递给渲染与每个说法的关联关系不大 - 您应该改为参考 Layouts & Rendering guide。
当您使用集合(模型实例数组)调用渲染时,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 的无效字符。
我阅读了关于关联的 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>
我想做的是将每个列表呈现为选项卡并将关联的项目呈现为选项卡内容。最终,我有多个不同的列表类型模型作为选项卡,并匹配多个不同的项目类型模型以呈现为选项卡内容。
编辑: 我摆脱了我的第二个问题,因为 post 很长,它可能是一个单独的 post。重申以上内容,如何获取上述集合并在列表是选项卡且关联的项目作为内容呈现的选项卡中成功呈现它? 如果我在 Users/show:
中使用这样的代码,我会 运行 遇到问题<div class="row">
<div class="col s12">
<ul class="tabs">
<%= render @lists %>
</ul>
</div>
<%=render @items %>
</div>
Lists/_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>
如果我尝试这个,那么我的项目部分会给我一个错误,因为我不能调用 list.id,它只会呈现我的所有项目而不将它们显示为与列表相关联的集合.如果我嵌套它并将 <%=render lists %> 之后的所有内容都放在部分列表中,则集合可以工作,但结束标记最终会导致问题。我不确定如何解决这个问题。
将集合传递给渲染与每个说法的关联关系不大 - 您应该改为参考 Layouts & Rendering guide。
当您使用集合(模型实例数组)调用渲染时,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 的无效字符。