我有一个资源Company
,它有许多Projects
和People
。公司的index
操作将每个公司显示在一个表中。show
动作显示了关于它的一些附加信息,然后我想显示的是另一个表,带有"Projects"one_answers"People"选项卡。
当我点击"People"选项卡时,我应该去URL"companies/:id/People",同样地,对于"Projects"选项卡。我不担心AJAX或在show
操作期间将所有这些信息预加载到@company
变量中。一个简单的嵌套资源就可以了。
现在,当我在"companies/:id/people",它将使用PeopleController#index
,但我想显示该视图(这只是它的表,我想?)嵌套在公司的show
视图。因此,当我在"companies/:id/people"one_answers"companies/:id/projects"之间切换时,唯一改变的是表格,而不是外部的公司信息。
这种事情容易做吗?如果Rails不是为了轻松处理这类事情而构建的,我不介意使用其他东西。我只是对视图层没有太多的经验,所以我不太了解它,因为我主要使用JSON。
基本例子:
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 %>
我建议您看一下rails指南,特别是从外到内的路由。
尽管rails可以处理这个问题,但是您的路由将按照以下方式设置:
resources :company do
resource :projects
resource :people
end
我假设您已经设置了所有CRUD操作,那么这将工作。但是要注意,它会改变你的命名路由。
。e
如果你在呼叫
projects_path
,它们现在将变成:
company_projects_path
你可以使用命令
查看完整的路由列表rake routes