[英]Rails 4 Dynamic Controller in routes
我正在创建一个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将来会有几种类似的关系,所以我现在想提出正确的方法。
您可以编写一个控制器名称数组,然后在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.