2013-08-06 2 views
5

나는 레이크 작업의 XML 출력을 생성하는 Rabl을 사용하고 있습니다 :Rabl.render : 뷰 도우미 메서드를 사용하는 방법?

xml = Rabl.render @listings, 'feeds/listings', :format => :xml 
# do stuff with xml 

그러나, 내가 참조 rabl보기 파일에 여러 헬퍼 메소드를 사용할 필요가, 그리고 나는 기대로 나는 NoMethodError가 계속 this question에 대한 답변.

나는 레이크 작업에 사용되는 클래스 extendsinclude를 사용하여 시도하지만 난 여전히 도우미 메서드에 같은 오류가 발생합니다 :

require "#{Rails.root}/app/helpers/feeds_helper.rb" 

class SerializeData 
    extends FeedsHelper 

    def perform 
    xml = Rabl.render @listings, 'feeds/listings', :format => :xml 
    # do stuff with xml 
    end 
end 

내 질문은 :에서 헬퍼 메소드를 사용 할 수있는 방법이 이 방법으로 생성 된 rabl보기 파일은 무엇입니까? (또는 최소한 레이크 작업에서 문자열로 렌더링 할 수있는 방식으로) 헬퍼 메서드는 여러 번 사용되어 고정 된 요구 사항에 따라 다양한 데이터를 올바르게 형식화하므로 완전히 제거하는 것은 매우 어려울 수 있습니다 .

답변

5

나는 원숭이 패치 믹 솔루션으로 끝났습니다.

나는 NoMethodFound 오류가 Rabl::Engine 클래스의 인스턴스에서 온 것으로 나타났습니다, 그래서 그 클래스에 필요한 라우팅 및 도우미 방법을 포함하고 다음에 액세스 할 수 있었다 :

require "#{Rails.root}/app/helpers/feeds_helper.rb" 
... 
class Rabl::Engine 
    include Rails.application.routes.url_helpers 
    include FeedsHelper 
end 

이 또한주의

Rails.application.routes.default_url_options[:host] = "www.example.com" 

나는 확실히 비를 선호하는 것 : URL 호스트가 추가로 url을 사용하는 경우 path 헬퍼 (예 : root_urlroot_path)로 설정해야 원숭이 - 패치 솔루션 또는 렌더링 된 액션의 컨트롤러에 따라 필요에 따라 헬퍼가 포함될 수있는 최소한 하나. 나는 누군가가 그런 대답을 내놓을 수 있는지보기 위해 이것을 받아 들일 것이다.

4

범위 매개 변수를 사용하여 범위 개체를 전달할 수 있습니다.

<%= Rabl::Renderer.json(object_to_render, 'api/v1/object/show', view_path: 'app/views', scope: self).html_safe%> 

그래서보기 컨텍스트 외부 사용자 정의에 전달해야 것 : 당신이 도우미 포함하여 개체에 액세스 할 수있는 경우 그럼 언제 뷰 컨텍스트처럼, 당신은 은 예를 들어 있음을 전달할 수 있습니다 이 헬퍼가 포함 된 객체를 포함시켜이 객체를 깨끗하게 만듭니다. 예를 들어

class RakeScope 
    include FeedHelper 
end 

Rabl::Renderer.json(object_to_render, 'api/v1/object/show', view_path: 'app/views', scope: RakeScope.new()) 

나는 두 번째 옵션을 시도하지했지만 첫 번째는 잘 작동합니다.

0

꽤 똑같은 문제는 아니지만 비슷한 문제가 RSpec 사양에서 도우미에 액세스했습니다. 필요한 헬퍼를 추가하는 데 사용할 수있는 범위를 만드는 도우미 함수를 만들었습니다. 다음은 경로와 url 도우미 메서드에 액세스 할 수있게 해주 었으며 Rake에서 비슷한 기능을 수행해야합니다.

#spec/support/rabl_helper.rb 
def render_rabl(object, options={}) 
    options = { 
    format: 'json', 
    view_path: 'app/views', 
    file:  example.example_group.top_level_description, 
    scope:  RablScope.new 
    }.merge(options) 

    result = Rabl.render(object, options.delete(:file), options) 
    options[:format] == 'json' ? JSON.parse(result) : result 
end 

class RablScope 
    include Rails.application.routes.url_helpers 
end