【问题标题】:How to customize the to_json method in rails3?rails3中如何自定义to_json方法?
【发布时间】:2011-06-09 20:45:04
【问题描述】:

我想将 Place 对象数组转换为 json,我一直在这样做:

var places = <%= @places.to_json.html_safe %>;

唯一的问题是@places 数组中的每个地方都有一个关联的标签列表,它没有被包含在内。我正在使用acts_as_taggable_on gem 来处理标签,所以要获取一个地方的标签列表,我需要说place.tag_list。

我必须做些什么才能让 javascript 数组中的每个位置都包含 tag_list?我想我需要编写自己的 to_json 方法,但我不知道如何。

编辑

事实证明,这比我意识到的要容易。我可以这么说:

var places = <%= @places.to_json(:include => :tags).html_safe %>

唯一的问题是它包含的每个标签的信息比我真正需要的要多。每个标签都有一个 id 和 name,我真正想要的只是一个包含标签名称的列表。

【问题讨论】:

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


    【解决方案1】:
    【解决方案2】:

    如果您打电话,Benson 的回答将不起作用

    render :json => @places
    

    在 PlacesController 中。您需要在 Place 模型中添加以下代码。

    # this method is called on a single instance
    def to_json(options={})
      options[:methods] ||= []
      options[:methods] << :tag_names
      super(options)
    end
    
    # this method is called for each instance in an Array to avoid circular references.
    def as_json(options={})
      options[:methods] ||= []
      options[:methods] << :tag_names
      super(options)
    end
    

    希望对其他人有所帮助。我不得不查看源代码来弄清楚为什么Array.to_jsonArray.each { |a| a.to_json }不一样

    【讨论】:

      【解决方案3】:

      to_json 方法还接受一个名为 methods 的参数。此参数允许您指定应调用并包含在对象的 json 表示中的方法。既然你提到你有一个名为tag_list 的方法,你可以这样做:

      var places = <%= @places.to_json(:methods => :tag_list).html_safe %>
      

      如果由于某种原因,您没有生成标签名称的方法,但每个标签都有一个方法来给您命名,您可以在 Place 模型中添加一个方法来生成标签列表像这样的名字:

      def tag_names
          tags.collect do |tag|
              tag.name
          end
      end
      

      然后您可以像这样使用tag_names 获取您的位置 json:

      place_json = @places.to_json(:methods => :tag_names)
      

      此技术适用于您想添加到模型的 json 表示中的任何计算属性。

      【讨论】:

      • +1 - 不错!我能想到一百万个地方我会用这个:)
      【解决方案4】:

      在您的 Place 类中,您可以覆盖 to_json。在 Rails 3 中,您应该改写 as_json:

      def as_json (options={})
        # add whatever fields you need here
      end
      

      然后将代码更改为:

      var places = <%= @places.as_json.html_safe %>;
      

      【讨论】:

      • 好吧,我还是不明白这个方法会是什么样子。我不明白如何包含每个地方 tag_list。
      • 同意,Benson 的回答很棒
      猜你喜欢
      • 2011-10-16
      • 1970-01-01
      • 2011-03-13
      • 1970-01-01
      • 2011-04-13
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多