【问题标题】:rails to_xml/to_json options导轨 to_xml/to_json 选项
【发布时间】:2014-06-20 05:41:03
【问题描述】:

我目前正在玩 Rails,我正在尝试将我的模型渲染为 xml 和 json。

现在,在我的所有模型中,我想删除 created_at 和 updated_at 列 - 并且在我的每个 to_xml/json 中添加一个例外是违反 DRY 的。

所以我想知道我该怎么做。

我看到人们重写 to_xml 方法 - 但我仍然必须对每个模型都这样做 - 如果有一个地方我需要这些列怎么办?

我正在寻找类似的东西

xxx = :except => [:created_at, :updated_at]

在每次渲染中,我将 xxx 发送到选项。

  • 作为记录 - 我知道如何使用 to_json/to_xml - 我只是不想重复这些常用选项。

【问题讨论】:

  • 它给了我一个线索——我的答案就是我终于做到了

标签: ruby-on-rails ruby ruby-on-rails-4


【解决方案1】:

我最终创建了一个覆盖 serializable_hash 的模块(用于 json 和 xml)

module DefaultRenderingModule

  def serializable_hash (options = {})
    if(options.has_key? :all)
       super(options.except!(:all))
    else
      x = [:created_at, :updated_at]
      if options.has_key? :except
        x.append(options[:except])
      end
      options.merge! :except => x
      super(options)
    end
  end
end

我将它包含在我想要这种行为的每个模型中

【讨论】:

    【解决方案2】:

    试试这个:

    xxx.to_json(:except => [ :created_at, :updated_at ])
    

    【讨论】:

    • 你在嘲笑我吗?或者这真的解决了我的问题吗? - 你只是放置 :except 选项。我知道该怎么做,我只是不想在每次渲染中都这样做......
    • 对不起,你觉得被嘲笑了......这是误导(但我仍然必须对每个模型都这样做 - 如果有这个地方我需要这些专栏怎么办?)
    • 好吧,与其直接使用选项,不如创建一个辅助方法,并将 active_record 对象发送给它。将 to_json 与您需要的选项放在一起。它墙开始返回你想要的..
    • 这真是太棒了,我为什么没想到...也许我只是认为有一个内置的 Rails 方法可以做到这一点
    【解决方案3】:

    覆盖模型中的 as_json。这是在您执行

    时用于生成 json 的内容

    渲染 :json => @object

    def as_json(options = {})
      super(options.merge(:except => [:created_at, :updated_at]))
    end
    

    您可以尝试一下 - 使用提交或不提交的选项。

    使用 :only、:methods 和 :include 来完全自定义输出。

    【讨论】:

      【解决方案4】:

      查看文档http://apidock.com/rails/ActiveRecord/Serialization/to_json:

      xxx.to_json(:except => [ :id, :created_at, :age ])
      

      【讨论】:

        【解决方案5】:

        【讨论】:

          猜你喜欢
          • 2012-11-30
          • 1970-01-01
          • 1970-01-01
          • 2012-11-10
          • 2011-05-25
          • 1970-01-01
          • 1970-01-01
          • 2019-04-22
          • 1970-01-01
          相关资源
          最近更新 更多