如何从rake任务将对象传递给rabl视图

时间:2012-05-22 18:40:09

标签: ruby-on-rails-3 json rabl

我正在尝试使用rabl从rake任务创建一个json文件。下面我有要测试的简化版本。

当我通过url查看'articles.json'或'articles / 2.json'时,我得到了预期的json响应。

但是当我尝试通过rake任务运行它时,它在创建的jsonFile中的@articles总是有一个空值。它将使index.json.rabl视图与@ articles.count的次数相同,但值始终为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

1 个答案:

答案 0 :(得分:11)

我遇到了类似的问题。你基本上有两个选择:

  1. 将单个对象明确作为参数
  2. 传递
  3. 通过范围隐式传递多个对象
  4. 按参数

    在您的任务中

    @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,并将对象指定为其实例对象(您可以将其命名为任何名称)

    按范围

    这有点棘手。我找到的唯一选项是将所需对象设置为调用范围中的实例变量,并为渲染模板设置此范围(请参阅范围)。

    在您的任务中

    @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 }