gpt4 book ai didi

ruby-on-rails - 判断 Controller 是否在 Rails 3 的嵌套路由中使用

转载 作者:行者123 更新时间:2023-12-04 22:37:07 24 4
gpt4 key购买 nike

我在 Ruby on Rails 3 项目中创建了一个嵌套路由。使用以下路由:

resources :companies do
resources :projects
end

现在我可以通过 example.com/projects/id 或 example.com/companies/id/projects/id 访问项目 Controller 的索引方法,但两个页面的显示方式完全相同。如何更改第二个示例中的项目页面以仅显示与该公司关联的项目?

最佳答案

我会改变你如何确定发现的范围。 Rails 3 很漂亮,因为它允许您执行此操作,因为几乎所有内容都是可作用域的。

首先在你的 Controller 中,我会使用这样的东西找到父资源:

before_filter :find_company

# your actions go here

private

def find_company
@company = Company.find(params[:company_id]) if params[:company_id]
end

这应该相当简单:查找 Company具有与从嵌套路由传入的 ID 匹配的 ID 的记录。如果它不是嵌套的,那么就不会有 params[:company_id]所以不会有 @company变量集。

接下来,您要根据是否为 ​​ @company 来确定项目查找的范围。设置。这也很容易。正下方第一 before_filter ,把这个:
before_filter :scope_projects

然后在 find_company 下定义它的方法像这样的方法:
def scope_projects
@projects = @company ? @company.projects : Project
end

现在你可能在想“哇”。我知道。我也是。

现在,无论您在哪里引用 projects协会或 Project类,使用 @projects反而。靠这个力量 scope_projects方法,您的应用程序将知道您的意思是“所有项目,曾经”还是“所有项目,曾经,在指定公司”。

现在,当您进入 View 时,您可以执行以下操作:
<h1><% if @company %><%= @company.name %>'s<% end %> Projects</h1>

你甚至可以将它移动到一个助手中:
def optional_company
if @company
@company.name + "'s"
end
end

并将丑陋的大块逻辑变成这样:
<h1><%= optional_company %> Projects</h1>

根据需要修改。

希望这有帮助。

关于ruby-on-rails - 判断 Controller 是否在 Rails 3 的嵌套路由中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4120537/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com