2014-10-08 55 views
0

我想要創建一個方法,該方法在從控制器調用時將添加具有路由到特定控制器的給定名稱的嵌套資源路由。例如,這...Rails 4.1:通過在控制器中調用方法創建路由

class Api::V1::FooController < ApplicationController 
    has_users_route 
end 

...應該是等同於...

namespace :api do 
    namespace :v1 do 
    resources :foo do 
     resources :users, controller: 'api_security' 
    end 
    end 
end 

...這將讓他們瀏覽到/api/v1/foo/:foo_id/users,並將請求發送到ApiSecurityController。或者它會去Api::V1::ApiSecurityController?它坦率地說並不重要,因爲它們都在同一個命名空間中。我想這樣做這種方式,因爲我想避免幾十個這樣的行:

resources :foo do 
    resources :users, controller: 'api_security' 
end 

resources :bar do 
    resources :users, controller: 'api_security' 
end 

使用方法更容易安裝和維護。

我很好,只要知道如何處理請求到控制器,但它是自動創建的路線,我有點不確定。處理這個問題的最好方法是什麼?我能找到的最接近的關於引擎的討論很多,但這並不合適,因爲這不是我想添加到我的應用程序中的獨立功能,它只是添加到現有資源的動態路由。

意見非常感謝!

+1

http://codeconnoisseur.org/ramblings/creating-dynamic-routes-at-runtime-in-rails-4 – juanpastas 2014-10-08 16:40:31

+0

什麼我試圖做的是有點不同,但我想我可以'#{我的應用程序名稱} .routes.draw'如他的示例中所示,一起破解這個......謝謝! – subvertallchris 2014-10-08 17:22:59

回答

0

我最終建立在@juanpastas,http://codeconnoisseur.org/ramblings/creating-dynamic-routes-at-runtime-in-rails-4建議的博客文章上,並根據我的需要定製它。從控制器中調用一個方法最終是一個不好的方法來處理它。我寫在我的博客整個事情http://blog.subvertallmedia.com/2014/10/08/dynamically-adding-nested-resource-routes-in-rails/但TL; DR:

# First draft, "just-make-it-work" code 

# app/controllers/concerns/user_authorization.rb 
module UserAuthorization 
    extend ActiveSupport::Concern 

    module ClassMethods 
    def register_new_resource(controller_name) 
     AppName::Application.routes.draw do 
     puts "Adding #{controller_name}" 
     namespace :api do 
      namespace :v1 do 
      resources controller_name.to_sym do 
       resources :users, controller: 'user_security', param: :given_id 
      end 
      end 
     end 
     end 
    end 
    end 
end 

# application_controller.rb 
include UserAuthorization 

# in routes.rb 
['resource1', 'resource2', 'resource3'].each { |resource| ApplicationController.register_new_resource(resource) } 

# app/controllers/api/v1/user_security_controller.rb 
class Api::V1::UserSecurityController < ApplicationController 
    before_action :authenticate_user! 
    before_action :target_id 

    def index 
    end 

    def show 
    end 

    private 
    attr_reader :root_resource 

    def target_id 
    # to get around `params[:mystery_resource_id_name]` 
    @target_id ||= get_target_id 
    end 

    def get_target_id 
    @root_resource = request.fullpath.split('/')[3].singularize 
    params["#{root_resource}_id".to_sym] 
    end 

    def target_model 
    @target_model ||= root_resource.capitalize.constantize 
    end 

    def given_id 
    params[:given_id] 
    end 
end 
相關問題