繁体   English   中英

路线中的Rails 4 Dynamic Controller

[英]Rails 4 Dynamic Controller in routes

我正在创建一个Rails api,并试图在我的控制器中保持模块化方法。 因此,我有一些模型OrganizationBranchUser 假设Users belong_to OrganizationBranches belong_to Organization

在所有其他控制器都扩展的基本控制器中,我想拥有一个index方法,该方法知道如何处理一些不同的路由:

Organizations/1/branchesOrganizations/1/users

该索引方法将比以下方法更为强大,但这就是这个主意:

def index
    Organization.joins(params[:relation_one].to_sym).where(id: params[:organization_id])
end

我的路线将这样定义:

scope '/organizations' do
  scope '/:organization_id' do
    get '/' => 'organizations#show'
    put '/' => 'organizations#update'

    scope '/:relation_one' do
      get '/' => ':relation_one#index'
      post '/' => ':relation_one#create'
      scope '/:relation_one_id' do
        get '/' => ':relation_one#show'
        put '/' => ':relation_one#update'
      end
    end
  end
end

如何创建与上述类似的动态路由,其中​​控制器基于url路由是动态的? 在没有我专门定义这两种路线的情况下,与以上代码段相似的内容应适用于Organizations/1/branchesOrganizations/1/users 这个API将来会有几种类似的关系,所以我现在想提出正确的方法。

您可以编写一个控制器名称数组,然后在routes.rb中运行循环

relations = [':relation_one', ':relation_two']
scope '/organizations' do
  scope '/:organization_id' do
    get '/' => 'organizations#show'
    put '/' => 'organizations#update'

    relations.each do |rel|
      scope "/#{rel}" do
        get '/' => "#{rel}#index"
        post '/' => "#{rel}#create"
        scope "/#{rel}_id" do
          get '/' => "#{rel}#show"
          put '/' => "#{rel}#update"
        end
      end
    end
  end
end

您可以创建一个常数,将要存储的所有控制器存储在一个数组中,然后在您的路由文件中进行迭代

AVAILABLE_CONTROLLERS = [:organizations, :branches, :users]
AVAILABLE_CONTROLLERS.each do |cname|
  scope "/#{cname}" do
    scope '/:id' do
      get '/', :action => :show
      put '/', :action => :update

      scope '/:relation_one' do
        get '/' => ':relation_one#index'
        post '/' => ':relation_one#create'
        scope '/:relation_one_id' do
          get '/' => ':relation_one#show'
          put '/' => ':relation_one#update'
        end
      end
    end
  end
end  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM