【问题标题】:Ruby to_json :methods argumentsRuby to_json:方法参数
【发布时间】:2011-02-14 07:03:24
【问题描述】:

我在一个对象上使用to_json 方法,并试图让:methods 参数起作用。我的模型(Drop)上有一个名为is_favorited_by_user? 的方法。此方法接受current_user 的参数,然后检查该drop 是否被用户收藏。如何通过to_json 方法传递此参数。

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

【问题讨论】:

    标签: ruby-on-rails render-to-response


    【解决方案1】:

    您可以在模型中添加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?)
    

    【讨论】:

    • 如何在 index 操作中进行渲染时扩展此解决方案:json => Drop.all。在哪里分配 current_user?
    • cattr_accessor :current_user 在模型中,然后在控制器中 Model.current_user = current_user
    • 如果您的环境是多线程的,那么将您的模型分配给类属性将不起作用。您可能正在将某些内容转换为 JSON,然后 current_user 突然发生变化,现在您的一半 JSON 用于一个用户,一半用于另一个用户。
    【解决方案2】:

    to_json 采用的方法并非旨在成为接受参数的方法,而只是“getter”方法。 (通常是根据您的 db 属性创建的。)

    在这里查看示例,没有传递参数:

    http://apidock.com/rails/ActiveRecord/Serialization/to_json

    如果你想做一些自定义的事情,你需要创建一个方法来构建你想要的信息散列,然后将该散列转换为 json。

    【讨论】:

    • 有没有办法在我的模型中获取 current_user 变量,所以我不需要传递参数?
    • @JamesFinley 模型不(也不应该)知道控制器或 http 请求的状态。 current_user 是请求的一部分,由于上述多线程问题,不应以全局方式向模型公开。它应该只作为方法参数传递。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 2012-07-20
    相关资源
    最近更新 更多