【问题标题】:Rails - Render JSON for one object and another object's attributeRails - 为一个对象和另一个对象的属性呈现 JSON
【发布时间】:2021-08-11 12:20:58
【问题描述】:

就像一周前刚开始一样,我对 Rails 还是很陌生。我想知道是否可以呈现 json 一个对象和另一个对象的属性。我实际上不知道我是否问对了问题。

无论如何,这是我控制器中的代码:

def create
  log_date = LogDate.find_or_initialize_by(date: log_params[:date])

  log_date.save if log_date.new_record?

  log = Log.new(log_params.except(:date))
  log.log_date_id = log_date.id

  if log.save
    render json: log.to_json(include: :log_date), status: :created
end

我在测试代码时得到的当前响应是这样的:

{
   "id": 1,
   "log_date_id": 1,
   "hours": 1,
   "ticket_number": "1",
   "description": "sample description",
   "created_at": "2021-08-11T11:41:59.636Z",
   "updated_at": "2021-08-11T11:41:59.636Z",
   "log_date": {
       "id": 1,
       "date": "2021-01-01",
       "max_hours": 8,
       "created_at": "2021-08-11T11:36:20.853Z",
       "updated_at": "2021-08-11T11:41:39.282Z"
   }
}

我想要达到的至少是这样的回应,但我不知道是否有可能:

{
   "id": 1,
   "log_date_id": 1,
   "hours": 1,
   "ticket_number": "1",
   "description": "sample description",
   "created_at": "2021-08-11T11:41:59.636Z",
   "updated_at": "2021-08-11T11:41:59.636Z",
   "date": "2021-01-01"
}

底部的“日期”基本上来自log_date。我不介意它位于顶部还是底部,只要响应格式看起来像这样,而不是现在的样子。

我真的希望这是可能的,有人可以帮助我。无论如何,如果不可能,那很酷。提前谢谢!

【问题讨论】:

    标签: ruby-on-rails rails-api


    【解决方案1】:

    使用delegation 公开log_date 上的方法,就好像它是日志实例上的方法一样:

    class Log < ApplicationRecord
      belongs_to :log_date
      delegate :date, to: :log_date
    end
    

    这基本上只是以下的简写:

    class Log < ApplicationRecord
      belongs_to :log_date
    
      def date
        log_date.date
      end
    end
    

    您可以在通过methods 选项呈现 JSON 时包含自定义方法:

    render json: log, methods: [:date], status: :created
    

    【讨论】:

    • 随着您的 JSON 渲染变得越来越复杂,您通常希望添加一个序列化层,例如任何 JSONAPI 序列化程序 gem、ActiveModel::Serializers 或 jBuilder。
    • 起初我想知道为什么日期没有包含在响应中,但我显然没有包含 :date 作为 LogSerializer 中的属性之一。无论如何,我得到了我想要的回应。非常感谢您的帮助!
    猜你喜欢
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多