2013-08-06 2 views
5

私はrakeタスクでXML出力を生成するためにRablを使用しています:Rabl.render:ビューヘルパーメソッドの使い方は?

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

はしかし、私は、参照さrablビューファイルで複数のヘルパーメソッドを使用する必要がある、と私はから予想されるようNoMethodErrorを得続けますthis questionに答えてください。

私はrakeタスクによって使用されるクラスで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 

はまたことに注意してくださいpathヘルパー(例えばroot_urlroot_path)に加えて、url使用している場合は、URLのホストを設定する必要があります。

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

を私は間違いなく非を好むだろうモンキーパッチソリューション、または少なくとも1つは、レンダリングされたアクションのコントローラに応じて必要に応じてヘルパーを含めることができます。誰かがそのような答えを出すことができるかどうかを確認するために、これを受け入れるのを待つつもりです。

4

scopeパラメータでスコープオブジェクトを渡すことができます。

<%= 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()) 

は、私は2番目のオプションを試していませんでしたが、最初は素晴らしい作品。

0

全く同じ問題ではありませんが、RSpec仕様からヘルパーにアクセスするのと同様の問題がありました。あなたが必要とするヘルパーを追加するためのスコープを作成するヘルパー関数を作成しました。以下は私にpathと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