我正在创建一个rails api,并试图在我的控制器中保持模块化方法。因此,我有一些模型 - Organization
,Branch
,User
。我们说Users belong_to Organization
和Branches belong_to Organization
。
在所有其他控制器扩展的基本控制器中,我希望有一个知道如何处理几条不同路由的index
方法:
Organizations/1/branches
和Organizations/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/branches
和Organizations/1/users
,而我没有明确定义这两个路由。这个API将会有这样的几个关系,所以我想现在想出正确的方法。
答案 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