Ruby to_json: methods参数

28
我正在使用to_json方法处理一个对象,并尝试让:methods参数起作用。我的模型(Drop)上有一个名为is_favorited_by_user?的方法。此方法接受current_user参数,然后检查用户是否已将其收藏。如何通过to_json方法传递此参数?
render :json => @drops.to_json(:methods => :is_favorited_by_user?(current_user))
2个回答

49
你可以为你的模型添加 current_user 属性,并在执行 to_json 之前设置它。
  attr_accessor :current_user

  def is_favorited_by_user?(user=nil)
    user ||= current_user
    # rest of your code
  end


@drops.current_user = current_user
render :json => @drops.to_json(:methods => :is_favorited_by_user?)

4
当我在index操作中执行render:json => Drop.all时,我该如何扩展此解决方案?我应该在哪里分配当前用户? - Vijay Dev
3
在模型中加入cattr_accessor :current_user,然后在控制器中使用Model.current_user = current_user。 (注:该代码用于在Rails中为模型动态添加一个名为current_user的类级别属性,并在控制器中设置该属性的值。) - Sergey Kishenin
4
如果你的环境是多线程的,将模型分配给类属性将无法正常工作。可能正在将某些内容转换为JSON,然后当前用户突然更改,现在一半的JSON是为一个用户而另一半是为另一个用户的。 - Reid Main

4
to_json方法的参数不是用于传递参数的,而是用于获取信息的“getter”方法。(通常是基于数据库属性创建的方法。)在这里看一些例子,没有传递参数:http://apidock.com/rails/ActiveRecord/Serialization/to_json如果您想要自定义内容,您需要创建一个构建所需信息哈希表的方法,然后将该哈希表转换为json。

1
有没有一种方法可以在我的模型中获取current_user变量,这样我就不需要传递参数了? - James Finley
1
@JamesFinley 模型不应该意识到控制器或 HTTP 请求的状态。current_user 是请求的一部分,不应以全局方式暴露给模型,因为上述多线程问题。它只应作为方法参数传递。 - hammady

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接