您的问题没有很好的答案 - 这完全取决于您的应用程序的布局。此外,这里有关于 to_param 和使用 AJAX 的有效答案,它们添加了重要的细节。但是,给你一个良好的开端。
对于您的视图/foos,将您的 index.html.erb 重写为:
<%= render partial: "show_foos", locals: { foos: @foos, selected_foo: nil }%>
而你的 show.html.erb 为:
<%= render partial: "show_foos", locals: { foos: @foos, selected_foo: @foo }%>
在 show 方法中的 foos_controller.rb 中,您需要同时获取 @foos 和 @foo,例如:
@foos = Foo.all
@foo = Foo.find(params[:id])
现在,到有趣的部分。返回views/foos 目录。创建一个名为“_show_foos.erb”的部分(我们从#index 和#show 调用的部分)。执行以下操作:
<table>
<tr>
<td>
<%= render partial: "show_foos_list", locals: { foos: foos, selected_foo: selected_foo }%>
</td>
<td>
<%= render partial: "show_foo_props", locals: { selected_foo: selected_foo }%>
</td>
</tr>
</table>
请注意,这是一个非常粗暴和丑陋的示例,它创建了一个包含两列的表:一列用于左侧“面板”中的 foo 列表,另一列用于在右侧“面板”中显示所选 foo 的结果。在现实生活中使用 div 和样式。此外,考虑将布局推送到它所属的位置 - 适当的布局文件 - 并在那里使用命名收益。但是,正如我所说,一个先机 - 简单的表。
现在,只需定义这里提到的两个部分。首先,“_show_foos_list.erb”列出了左侧的 foo。假设每个 foo 都有一个“title”属性,例如:
<% foos.each do |foo| %>
<%= link_to_unless selected_foo && (foo.id == selected_foo.id), foo.title, foo %><br />
<% end %>
其次,右边的 foo & foo_bars - “_show_foo_props.erb”:
<% if selected_foo %>
# Here display the Foo attributes
<h2> Foo: <%= selected_foo.title %> </h2>
<% selected_foo.foo_bars.each do |foo_bar| %>
# Here display each FooBar that belongs to Foo
<h3>FooBar <%= foo_bar.title %></h3>
<%= foo_bar.description %>
<% end %>
<% end %>
再次,非常粗略的例子。将 'title'、'description' 替换为正确的参数集,使用部分显示 FooBars。使用 CSS 进行样式设置。等等,等等……根据您的需要进行重构。
谈论路线。当您访问“www.yourapp.com/foos”网址时,您得到的是左侧所有 foo 的列表,右侧没有任何内容。按下左栏中的任何 foo 后,您将转到“www.yourapp.com/foos/:id”,其中 :id 是所选 foo 的 ID(并从此处的其他答案或更高级的技术中考虑 to_param使这部分有意义)并在左侧获取 foos 列表,在右侧获取所选 foo 和所有属于它的 foo_bars 的属性。
希望这有助于根据此处提出的粗略想法开始布局您自己的实现。