GSt*_*Sto 4 routing ruby-on-rails ruby-on-rails-3
我在Ruby on Rails 3项目中创建了一个嵌套路由.使用以下路由:
resources :companies do
resources :projects
end
Run Code Online (Sandbox Code Playgroud)
现在我可以通过example.com/projects/id或example.com/companies/id/projects/id查看项目控制器的索引方法,但两个页面都以完全相同的方式显示.如何在第二个示例中更改项目页面以仅显示与该公司关联的项目?
Rya*_*igg 10
我会改变你的发现范围.Rails 3非常漂亮,因为你可以做到这一点,因为几乎所有东西都是可以扩展的.
首先在你的控制器中我会找到父资源使用这样的东西:
before_filter :find_company
# your actions go here
private
def find_company
@company = Company.find(params[:company_id]) if params[:company_id]
end
Run Code Online (Sandbox Code Playgroud)
这应该是相当直接的:查找Company具有与嵌套路由传入的ID匹配的ID 的记录.如果它没有嵌套,那么就不会params[:company_id]这样,因此不会有@company变量集.
接下来,您要根据是否@company设置来查找项目查找的范围.这也很容易.在第一个下面before_filter,把这一个:
before_filter :scope_projects
Run Code Online (Sandbox Code Playgroud)
然后在方法下面为它定义方法,find_company如下所示:
def scope_projects
@projects = @company ? @company.projects : Project
end
Run Code Online (Sandbox Code Playgroud)
现在你可能在想"WOAH".我知道.我也是.
现在无论您在哪里引用projects关联或Project类,请@projects改用.通过这种scope_projects方法的强大功能,您的应用程序将知道您的意思是"所有项目,永远"还是"所有项目,在指定公司中".
现在,当您进入视图时,您可以执行以下操作:
<h1><% if @company %><%= @company.name %>'s<% end %> Projects</h1>
Run Code Online (Sandbox Code Playgroud)
你甚至可以把它变成一个帮手:
def optional_company
if @company
@company.name + "'s"
end
end
Run Code Online (Sandbox Code Playgroud)
并把那个丑陋的hunk-o-logic变成这个:
<h1><%= optional_company %> Projects</h1>
Run Code Online (Sandbox Code Playgroud)
根据需要修改.
希望这有帮助.
| 归档时间: |
|
| 查看次数: |
782 次 |
| 最近记录: |