2014-12-31 2 views
0

"Rails 4 Patterns"코드 스쿨 코스의 학습 내용을 사용하여 데코레이터를 구현하려고하는데 문제가 발생했습니다. Decorator 클래스. 그런 다음 장식의레일즈에서 데코레이터 패턴을 사용하지만 뷰 도우미에 액세스 할 수 없습니다.

<%= @model_decorator.previous %> 

을 :

내가 내보기가 갖고 싶어

과정은 당신이보기 파일 자체에보기 도우미에서 데코레이터로 전화를 걸 제안
def previous 
    if object.prev_item.nil? 
    "Previous" 
    else 
    link_to("Previous", object) 
    end 
end 

, 하지만 논리가 하나의 도우미와 하나의 결과를 출력 할 수 있다면 좋지 않습니다. (즉, 출력이 링크인지 아닌지를 필요로 함).

helpers.link_to을 사용해 보았지만 url_for 옵션에 올바른 정보를 제공하지 않는 것으로 오류가 발생했습니다. 보기 자체 내에서 link_to("Previous", object)이 작동하는지 확인했습니다.

답변

2

문제를 올바르게 이해했다면 본질적으로 오래된 루비 객체에 링크가 있어야합니다.

내 솔루션이 될 것이다 :

include ActionView::Helpers::UrlHelper 
link_to("Previous", Rails.application.routes.url_helpers.objects_path(object)) 
# assuming the object is always of one class 

객체가 다른 클래스의 경우,이 app 예 :

include ActionView::Helpers::UrlHelper 
link_to("Previous", Rails.application.routes.url_helpers.send("#{object.class}s_path".downcase.to_sym, object)) 
# I'd create a function out of that line to make it a bit neater 
에 올바른 메시지를 보낼 .send 방법을 사용하는 것이 가능한 것보다

url_for 님이 던진 오류는 경로가 누락 된 것과 같습니다. 경로를 포함하는 데는 몇 가지 방법이 있습니다. 내 솔루션 좀 Rails.application.routes.url_helpers 사용하여 문제를 피할 수 있습니다. 희망이 도움이! 레일

2

include ActionView::Helpers::UrlHelper 

link_to("Previous", Rails.application.routes.url_helpers.send("#{object.class.name.underscore}s_path".to_sym, object)) 

내가 그것을위한 장식하기 위해 더 나은 그것은`에 관해서는 4 :

class LinkDecorator 
    include ActionView::Helpers::UrlHelper 

    def initialize(label, object) 
    @label = label 
    @object = object 
    end 

    def show 
    link_to(label, url_helpers.send("#{object.class.name.underscore}s_path".to_sym, object)) 
    end 

    def index 
    link_to(label, url_helpers.send("#{object.class.name}s_path".to_sym)) 
    end 

    ... 

    private 

    attr_reader :label, :object 

    def url_helpers 
    Rails.application.routes.url_helpers 
    end 
end 

사용 예제 :

LinkDecorator.new(object.name, object).show 
관련 문제