路由中的Rails 4动态控制器

时间:2015-03-10 00:11:28

标签: ruby-on-rails ruby-on-rails-4 rails-api

我正在创建一个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将会有这样的几个关系,所以我想现在想出正确的方法。

2 个答案:

答案 0 :(得分:1)

你可以编写一个控制器名称数组,然后在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

答案 1 :(得分:1)

你可以创建一个常量来存储你想要在数组中拥有的所有控制器,然后在你的路由文件中迭代

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