如何为在Rails中的父资源中显示为选项卡的嵌套资源设置视图?

时间:2013-01-05 19:40:27

标签: ruby-on-rails ruby-on-rails-3 nested-resources

我的资源Company有很多ProjectsPeople。公司的index操作会在表格中显示每个公司。 show操作会显示一些有关它的其他信息,然后我要显示的是另一个表格,其中包含“项目”和“人物”标签。

当我点击“人物”标签时,我应该转到“公司/:id / people”网址,同样也可以转到“项目”标签。我并不担心AJAX或在@company操作期间将所有这些信息预先加载到show变量中。一个简单的嵌套资源就可以了。

现在,当我在“公司/:id / people”时,它将使用PeopleController#index,但是我希望显示该视图(我认为它只是它的表格?)嵌套在公司的{ {1}}查看。因此,当我在“公司/:id / people”和“公司/:id / projects”之间切换时,唯一改变的是表格,而不是外围的公司信息。

这种事情很容易做到吗?如果没有构建Rails来轻松处理这类事情,我不介意使用别的东西。我对视图层没有太多经验,所以我对它的了解并不多,因为我主要使用JSON。

2 个答案:

答案 0 :(得分:2)

基本示例:

ProjectsController&&把PeopleController:

layout :current_layout

def current_layout
  if @company && @company.persisted? && request.path_parameters[:action] == "index" # i prefer helper 'current_action'
    "company"
  else
    "application"
  end
end

助手:

def parent_layout(layout)
  @view_flow.set(:layout, self.output_buffer)
  self.output_buffer = render(:file => "layouts/#{layout}")
end

公司布局:

#views/layouts/company.html.erb

<h1><%= @company %></h1>
<ul class="tabs">
 <li>Info</li>
 <li>Info</li>
 <li>Info</li>
</ul>
<%= yield %>
<%= parent_layout(:application) %>

人物模板:

# views/people/index.html.erb

<% if current_layout == "company" %> # just table
  <%= render "people_table" %>
<% else %>
  <h1>People controller</h3>
  <%= render @people %>
<% end %>

项目模板:

# views/projects/index.html.erb

<% if current_layout == "company" %> # just table
  <%= render "projects_table" %>
<% else %>
  <h1>Projects controller</h3>
  <%= render @projects %>
<% end %>

答案 1 :(得分:0)

我建议您查看导轨指南,特别是routing from the outside in

然而,rails可以处理此问题,您的路线将按以下方式设置:

resources :company do
       resource :projects
       resource :people
end

我假设您已经设置了所有CRUD操作,那么这将有效。但请注意,它会改变您的命名路线。

如果你打电话

projects_path

在您的观看中,它们现在将成为:

company_projects_path

您可以使用命令

查看完整的路线列表
rake routes