Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 4路由中的动态控制器_Ruby On Rails_Ruby On Rails 4_Rails Api - Fatal编程技术网

Ruby on rails Rails 4路由中的动态控制器

Ruby on rails Rails 4路由中的动态控制器,ruby-on-rails,ruby-on-rails-4,rails-api,Ruby On Rails,Ruby On Rails 4,Rails Api,我正在创建一个rails api,并试图在我的控制器中保持模块化方法。因此,我有一些模型-组织,分支机构,用户。假设用户属于组织,而分支属于组织 在所有其他控制器扩展的基本控制器中,我希望有一个index方法,它知道如何处理几个不同的路由: 组织/1/分支机构和组织/1/用户 该索引方法将比以下方法更加有力,但这是一个想法: def index Organization.joins(params[:relation_one].to_sym).where(id: params[:organ

我正在创建一个rails api,并试图在我的控制器中保持模块化方法。因此,我有一些模型-
组织
分支机构
用户
。假设
用户属于组织
,而
分支属于组织

在所有其他控制器扩展的基本控制器中,我希望有一个
index
方法,它知道如何处理几个不同的路由:

组织/1/分支机构
组织/1/用户

该索引方法将比以下方法更加有力,但这是一个想法:

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路由是动态的?类似于上述代码片段的内容应该适用于
组织/1/分支机构
组织/1/用户
,而无需我专门定义这两个路由。这个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

您可以创建一个常量,用于在数组中存储您想要的所有控制器,然后在routes文件中进行迭代

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