2014-10-08 2 views
0

컨트롤러에서 호출되면 특정 컨트롤러로 라우트되는 주어진 이름의 중첩 된 리소스 라우트를 추가하는 메소드를 만들고 싶습니다. 예를 들어,이 ... 레일 4.1 : 컨트롤러에서 메소드를 호출하여 경로 생성하기

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

는 ... 그들을 /api/v1/foo/:foo_id/users를 검색 할 수 있습니다 것입니다과 ApiSecurityController에 요청을 보낼 것이다 ...

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

...에 해당해야한다. 아니면 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

+0

무엇 내가하려고하는 일은 조금 다르지만,이 예제에서 보여 지듯이 # {My app name} .routes.draw'를 함께 해킹 할 수 있다고 생각합니다 ... 감사합니다! – subvertallchris

답변

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 
관련 문제