2013-12-20 4 views
0

RESTful 액션에 기본 기능을 제공하기 위해 일반 컨트롤러에서 작업하고 있지만 추가 경로를 추가해야 할 때 문제가 있습니다. 모든 기본 동작은 인덱스 뷰 또는 표시 뷰에서 모든 동작을 렌더링합니다. 내 코드는 다음과 같이 설정됩니다 (관련없는 많은 코드가 잘립니다). 개발에before_filter가 개발 및 생산 모드에서 다르게 작동합니다.

module RestController extend ActiveSupport::Concern 
    included do 
    before_action: setup_index_view, 
        only: [:index, :new, :create] << @additional_index_routes 
    before_action: setup_show_view, 
        only: [:show, :edit:, update, :destroy] << @additional_show_routes 
    end 

    def setup_rest_controller(_additional_index_routes, 
          _additional_show_routes) 
    @additional_index_routes = _additional_index_routes 
    @additional_show_routes = _additional_show_routes 
    end 

    def setup_index_view 
    # default behavior, sets @{collection_name} = {Model.collection} 
    # code trimmed 
    end 

    def setup_show_view 
    # default behavior, sets @{instance_name} = {Model.find(params[:id]} 
    # code trimmed 
    end 
end 

class Order < ApplicationController 
    def initialize 
    setup_rest_controller(
     _additional_show_routes: [:quote, :contract, invoice_report]) 
    end 

    def setup_index_view 
    #override default behavior to filter andpaginate collection 
    @orders = Orders.active.search(search_terms).paginate 
    end 

    #accept default behavior for setup_views 
end 

이 코드는 (나는 그것이 나에게 약간의 놀라움 인정) 잘 작동하지만, 생산에 추가 경로는 setup_show_method을 실행하지 않습니다. gem 파일의 유일한 차이점은 rspec-rails가 개발에 포함된다는 것입니다. 누구든지이 코드가 왜 다르게 동작하는지 알 수 있습니까?

편집 게시물을 올리 자마자 '왜'날 공격했습니다. 개발 과정에서 코드는 각 요청마다 다시로드되고 프로덕션에서는 한 번만로드됩니다. 처음로드에서는 @additional_show_routes로드가 설정되어 있지 않으므로 before_action call에 추가 경로가 추가되지 않습니다. 그런 다음 새로운 질문 ... 원하는 동작을 얻으려면 어떻게해야합니까?

before_action의 전화 번호를 OrdersController에 추가하면 RestController의 번호가 무시되고 기본 기능이 중단됩니다.

before_action에 전화를 추가하면 setup_rest_controller에 NoMethodError가 발생합니다.

이와 같은 우려를 추가 할 때 setup_rest_controller 대신 new 대신 @additional_show_views을 사용할 수있는 방법이 있습니까?

+0

'initialize' 메소드를 인계하는 것이 ' 기본 행동을 어기 는가? –

+0

이것은 내재 된 복잡성 때문에 즉시 되돌릴 코드 종류입니다. 추상화가 모든 투쟁의 가치가 있다는 것을 정말로 확신합니까? ApplicationController에서 그 동작을 구현할 방법이 없습니까? – phoet

답변

0

이것은 해킹과 같지만 원하는 결과를 얻는 것으로 보입니다.

class OrdersController < ApplicationController 

    prepend_before_action Proc.new { send :setup_index_view}, 
     only: [:new_restful_action] 

    def setup_index_view 
    #override default behavior to filter andp aginate collection 
    @orders = Orders.active.search(search_terms).paginate 
    end 

    #accept default behavior for setup_views 
end 

또한 RestController@additional_{X}_routes에 대한 모든 참조를 놓습니다. 위의 코드에서 prepend_이 필요하다는 것을 모르지만 실제 코드에는 @additional_{X}_routes 뒤에 실행해야하는 다른 before_filters가 있습니다 ...