2012-10-03 6 views
0

나는 레일 응용 프로그램을 만드는 중이라서, 나는 수 사용이보기에 전달되는 모델 객체는 다음과 같이,이 객체에 어떤 행동의 URL을 얻을 수 있도록하고 싶습니다 :모델을 레일스에서 ​​컨트롤러를 인식하도록 만드는 방법은 무엇입니까? 예를 들어,

link_to object.public_send(attribute), 
     { :controller => object.controller_path, 
      :action  => :show, 
      :id   => object.id } 

어떤 것 이것을하는 좋은 방법이 될까요? Draper과 같은 데코레이터로 할 수 있습니까? 온라인으로 몇 가지 예가 있습니까?


업데이트. 나는 이것에 대해 생각해 보았고 데코레이터가 컨트롤러 정보를 유지하기에 좋은 장소가 아니라고 결정했다. 장식 자의 책임이 아닙니다. 데코레이터는 형식이 지정된 데이터를 마크 업으로 렌더링하는 방법 만 알고 있어야합니다. 지금은 Accessor이라는 모듈을 만들었습니다. 여기서 컨트롤러와 라우팅 인식 모델을 혼합하려고합니다. 나는 더 좋은 방법이 있는지 아직도 궁금합니다.

+0

필요한 이유를 명확히 할 수 있습니까? 어쩌면 당신이 [url_for] (http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-url_for)로 할 수있는 것입니까? –

+0

고마워, 이건 내가 원하는 것에 가깝지만 이미 시도해 봤어. 'url_for '의 가장 큰 문제점은 알고있는''polymorphic_url'] (https://github.com/rails/rails/blob/537ede912895d421b24acfcbc86daf08f8f22157/actionpack/lib/action_dispatch/routing/polymorphic_routes.rb#L90)에 의존한다는 것입니다. 컨트롤러 이름을 추측하기 위해 모델에 대해서는 아무것도 아니며 Inflector에 의존합니다. 사용자 정의 이름을 사용할 수 없습니다. 작은 문제는 다른 상황에서 동일한 모델을 관리하기 위해 다른 컨트롤러가 필요할 수 있다는 것입니다. – Alexey

+0

당신은 이것을 위해 필요한 것을 보여줄 수 있습니까? 여러 발표자 클래스를 원하는 것처럼 보이지만 달성하려는 대상에 따라 과도 함일 수 있습니다. –

답변

0

보기에 다른 인스턴스 변수가 없어도 매우 간단한 클래스 (데코레이터가 필요 없음)를 사용하여 구현할 수 있습니다.

class AController 
    def edit 
    @router = MyRouter.new(self, object) 
    render 'shared_view' 
    end 
end 

class BController 
    def edit 
    @router = MyRouter.new(self, object) 
    render 'shared_view' 
    end 
end 

그리고 공유 뷰 : 당신의 컨트롤러에

class MyRouter 
    def initialize(controller, object) 
    @controller = controller 
    @object  = object 
    end 

    def url_for(action_name) 
    controller.url_for(object, :action => action_name) 
    end 
end 

물론

<%= @router.url_for(:show) # Varies with the controller that rendered the view %> 

, 이것은 당신이 대상으로하려는 컨트롤러가 렌더링 같은 컨트롤러가 있다고 가정 보기, 이는 사실이 아닐 수도 있습니다. 그러나이 패턴을 사용하면보기를 변경하지 않고도 (예 : 복수 Router 클래스를 사용하여) 사용자의 요구에 맞는 더 복잡한 논리를 수용 할 수 있습니다.

+0

필자의 경우 대상 컨트롤러는 현재 컨트롤러보다 모델 클래스에 더 의존하며 뷰에 전달 된 여러 개체가있을 수 있으며 각 컨트롤러는 자체 컨트롤러에 대한 링크를 지정해야합니다. – Alexey

+0

대상 컨트롤러는 각 개체마다 어떻게 다릅니 까? 공유보기를 렌더링하는 것은 컨트롤러에 의해 결정됩니까? 아니면 다른 기준이 있습니까? –

+0

현재 컨트롤러는 어떤 모델 클래스와 연관된 "홈 (home)"컨트롤러를 결정합니다. 그러나 대부분의 경우 모델 클래스에만 의존합니다. – Alexey

0

저는 Avdi Grimm이 Objects on Rails이라는 매우 흥미로운 해결책을 발견했습니다 : Exhibits for REST. 간단히 말해서, 그의 생각은 여러 루비의 SimpleDelegator을 다양한 기능을 가진 데코레이터로 적용하는 것입니다.

관련 문제