通过options hash将值传递给as_json?

时间:2010-09-14 07:53:40

标签: ruby-on-rails json devise

我正在尝试传递一个对象(当前用户),以便在渲染集合的json时使用。

respond_to do |format|
  format.html # index.html.erb
  format.xml  { render :xml => @items }
  format.json { render :json => @items.to_a.as_json(:user => current_user) }
end

但是,这似乎没有效果,因为as_json方法中的选项[:user]为nil。

JSON_ATTRS = ['id', 'created_at', 'title', 'content']
def as_json(options={})
  # options[:user] is nil!
  attributes.slice(*JSON_ATTRS).merge(:viewed => viewed_by?(options[:user]))
end

任何人都知道为什么这不起作用,或者可以建议一种更优雅的方式让json渲染器知道当前用户?

谢谢, 卫

2 个答案:

答案 0 :(得分:1)

你在一个数组(@items.to_a)上调用as_json,你确定这是你想要的吗? 如果您尝试在模型上调用它,则需要执行类似@items.to_a.map{|i| i.to_json(:user => current_user)}的操作(并且您可能不需要to_a)。

你应该打to_json。它会调用as_json获取你的属性,传递你提供的任何选项,但返回一个正确格式化的json-string(as_json返回一个ruby对象)。

答案 1 :(得分:0)

顺便说一句,如果你想将选项传递给“子”关联,我发现这很有效(至少在mongo_mapper支持的项目中):

def as_json(options={})
  {
      :field1   => self.field1,
      :field2   => self.field2,
      :details  => self.details.map{|d| d.to_json(options)}
  }
end