Ruby on rails 在rails中同时使用嵌套资源和浅层资源可以吗?如何编写控制器/视图?

Ruby on rails 在rails中同时使用嵌套资源和浅层资源可以吗?如何编写控制器/视图?,ruby-on-rails,resources,controller,nested,Ruby On Rails,Resources,Controller,Nested,我有一些资源,最好将它们与其他资源嵌套并单独处理。即,我希望使用以下所有URL: /account/4/transfers # all transfers which belong to an account /user/2/transfers # all transfers input by specific user /project/1/transfers # all transfers relevant to a project /transfers

我有一些资源,最好将它们与其他资源嵌套并单独处理。即,我希望使用以下所有URL:

/account/4/transfers   # all transfers which belong to an account
/user/2/transfers      # all transfers input by specific user
/project/1/transfers   # all transfers relevant to a project
/transfers             # all transfers
我关心的是如何编写TransfersController操作(例如索引),因为它会使父模型中的逻辑增加一倍-有没有比这样做更好的方法

TransfersController
...
def index
  if !params[account_id].nil?
    @account = Account.find(params[account_id])
    @transfers = @account.transfers
  elsif !params[user_id].nil?
    @user = User.find(params[user_id])
    if @user.accesible_by?(current_user)
      @transfers = @user.transfers
    end
  elsif !params[projects_id].nil?
    .....
视图也是如此——尽管它们都会列出传输,但对于用户、帐户、项目等,它们的标题、导航等都会非常不同


我希望您能从这个示例中看到模式。我认为应该有一些非丑陋的解决方案。基本上,我希望将选择要显示的传输的逻辑与其他内容(如视图的上下文特定部分)分开。

我有一个悬而未决的问题。在我的问题中,我概述了我提出的两种方法。我目前正在使用第二个,它工作得很好

我使用的路径有点不同,因为我使用用户名来代替ID,我首先需要它们。你会坚持这样做:

namespace :projects, :path => 'projects/:project_id' do
  resources :transfers #=> controllers/projects/transfers_controller.rb
end

# app/controllers/projects/transfers_controller.rb
module Projects
  class TransfersController < ApplicationController
    # actions that expect a :project_id param
  end
end

# app/controllers/transfers_controller.rb
class TransfersController < ApplicationController
  # your typical actions without any project handling
end
名称空间:projects,:path=>'projects/:project\u id'do
资源:传输#=>controllers/projects/transfers#u controller.rb
结束
#app/controllers/projects/transfers\u controller.rb
模块项目
类TransfersController<应用程序控制器
#需要:project_id参数的操作
结束
结束
#app/controllers/transfers\u controller.rb
类TransfersController<应用程序控制器
#没有任何项目处理的典型操作
结束

我之所以使用名称空间而不是调用
resources
,是为了让Rails允许我使用具有不同视图的单独控制器来处理同一个模型,而不是将所有讨厌的条件逻辑推到控制器操作中

使用此模型的视图的放置方式是什么?这是否与项目有许多转移等的事实很好地配合?在上面的命名空间路由中,
project\u传输的视图将位于
views/projects/transfers/*
,而常规
传输的视图将位于
views/transfers/*
。如果这不适合您尝试执行的操作,那么在控制器中处理的浅嵌套路由的另一个选项可能更适合。我很想听到另一种方式(因此我问了这个问题)。好的,我已经考虑过你的解决方案,我实际上认为这可能是一个好的解决方案,但我仍然有一种感觉,我们正在以某种方式“反”轨道工作。如果有像嵌套路由、内置支持这样的概念:has_many,那么在编写控制器时,如果一个模型嵌套在多个地方,就没有与之对应的概念,这感觉很奇怪。我已经阅读了你的问题,你的要求很有趣。为什么要/:username/photos而不是/users/:user_id/photos或/users/:username/photos?@gom名称空间内置于Rails中。我看不出使用它们是如何违反规则的。如果这不是您想要的,您可以使用条件来处理控制器操作中的不同参数,或者根据收到的参数分别定义路由以映射到不同的操作。