2010-03-25 9 views
2

레일즈에서 컨트롤러를 동적으로 생성하는 가장 좋은 방법은 무엇입니까?레일에서 컨트롤러 프로그래밍 방식으로 만들기

클래스를 상속받은 컨트롤러를 생성해야하는 클래스가 있습니다./app/controllers에 여러 개의 파일을 만들 수는 있지만 기본적으로 빈 파일입니다. 이러한 클래스를 동적으로 생성하고 레일스의 다른 컨트롤러처럼 처리하도록하는 방법이 있어야합니다. dev 모드에서 올바르게 다시로드되었습니다.

는 내가 설정/초기화에이 퍼팅 시도 :이 일을

FL.contact_types.each do |contact_type| 
    controller_name = "#{contact_type.pluralize}Controller" 
    Object.const_set(controller_name.to_sym, Class.new(ContactsController)) unless Object.const_defined?(controller_name.to_sym) 
end 

,하지만 난 AuthenticatedSystem의 사본 모듈 트리에서 제거하지만 여전히있다 "종속성/다시로드 문제로 실행 얻을 active "는 ContactController가 AuthenticatedSystem을 포함하는 ApplicationController로부터 상속 받기 때문에 발생합니다.

빈 파일을 많이 만드는 것이 가장 좋은 해결책입니까?

답변

2

컨트롤러가 여러 개 필요합니까? 작동 방식을 나타내는 값이 전달되는 단일 컨트롤러를 사용할 수 있습니까? 공통 기능을 가진 모듈을 만들고 모듈을 참조하는 빈 컨트롤러 파일을 만들 수도 있습니다. 시스템을 안내하는 type_of_contact : PARAMS에 당신이 키를 가지고, 모든 작업에서 지금

map.route "/:type_of_contact/:action/:id/, {:controller => :contact_type} 

:

경로

이있는 유형을 전달하는 데 사용 할 수있다.

당신이 다른 컨트롤러에 대한 액세스를 무시하지 않도록 이것이 경로 끝 부분에 있는지 확인하고 싶습니다.

+0

들어오는 작업의 특정 집합에 대한 포괄 컨트롤러를 원하는 것처럼 들립니다. –

+0

음, 각 ContactType에 대해 별도의 컨트롤러가 필요하다고 생각했습니다. 그들 모두는 접촉 이었지만 몇몇은 여분의 필드 또는 두 개를 가졌습니다. 그래서 STI는 올바른 방향과 같았습니다. 그리고 그것은 작동하지만, 방금 똑같은 일을 한 모든 컨트롤러를 다 잡으려고 했으므로 ContactsController에서 모두 상속받습니다. 그러나 추가 컨트롤러를 없애고 ContactsController를 통해 모든 작업을 수행 할 수 있습니다. 형식을 명시 적으로 설정하면 form_for 마법을 사용할 수 없습니다. 나는 그것이 여전히가는 길일지도 모른다라고 생각한다. 그냥 다른 혼란. –

+0

글쎄, 난 그냥 내 연락처 컨트롤러를 통해 모든 것을 실행 솔루션으로 갔다. 나는 그것을 좋아하지 않지만, 두 가지면에서 상반되는 것처럼 보인다. 이 방법은 더 적은 해킹을 사용해야하는 것처럼 보였습니다. 그게 뭔가를 말한 것 같아요. :) 감사합니다 –

관련 문제