2

rabl を使用して rake タスクから json ファイルを作成しようとしています。以下に、テスト用の簡略化されたバージョンを示します。

URL を介して「articles.json」または「articles/2.json」を表示すると、期待される json 応答が得られます。

しかし、rake タスクを介して実行しようとすると、作成された jsonFile の @articles に常に null 値が含まれます。@articles.count と同じ回数 index.json.rabl ビューをレンダリングしますが、値は常に null です。

では、rake タスクで作成した @articles オブジェクトを Rabl.render に渡すにはどうすればよいでしょうか?

index.json.rabl

@feedName ||= 'default'
node(:rss) { partial('articles/rss), :object => @feedName }
node(:headlines) { partial('articles/show'), :object => @articles }

show.json.rabl

object @article
attributes :id,:body
....

exports.rake

task :breakingnews => :config do
  filename = 'breakingnews.json'
  jsonFile = File.new(filename)
  @articles = Article.limit(10)
  n = Rabl::renderer.json(@articles,'articles/index',view_paths => 'app/views')
  jsonFile.puts b
  jsonFile.close
4

1 に答える 1

11

同様の問題に遭遇しました。基本的に 2 つのオプションがあります。

  1. 単一のオブジェクトをパラメーターとして明示的に渡す
  2. スコープによって複数のオブジェクトを暗黙的に渡す

パラメータ別

あなたのタスクで

@your_object = ...
Rabl.render(@your_object, 'your_template', view_paths => 'relative/path/from/project/root', :format => :json)

Rabl テンプレートで

object @any_name_you_like
attributes :id,:body
....

これにより、インスタンス オブジェクトとして指定されたオブジェクトを使用して、テンプレートが json としてレンダリングされます (任意の名前を付けることができます)。

スコープ別

これはもう少しトリッキーです。私が見つけた唯一のオプションは、目的のオブジェクトを呼び出しスコープのインスタンス変数として設定し、このスコープをテンプレートのレンダリング用に設定することです ( scopeを参照)。

あなたのタスクで

@one_object = ...
@another_object = ...
Rabl.render(nil, 'your_template', view_paths => 'relative/path/from/project/root', :format => :json, :scope => self)

Rabl テンプレートで

object @one_object
attributes :id,:body
node(:my_custom_node) { |m| @another_object.important_stuff }
于 2012-06-13T18:08:28.287 に答える