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
을 사용할 수있는 방법이 있습니까?
'initialize' 메소드를 인계하는 것이 ' 기본 행동을 어기 는가? –
이것은 내재 된 복잡성 때문에 즉시 되돌릴 코드 종류입니다. 추상화가 모든 투쟁의 가치가 있다는 것을 정말로 확신합니까? ApplicationController에서 그 동작을 구현할 방법이 없습니까? – phoet