Rails 5 API - 使用虚拟属性保存数据不会保存数据

时间:2018-03-16 12:48:27

标签: ruby-on-rails

我有一个模型,它在api中暴露了一个名为'body'的字段。用户提交包含该字段的json,它应该保存到数据库中名为“custom_body”的字段中。

如果custom_body为空,那么我使用i18n返回'body'字段的默认字符串。

这是模型:

class Reminder < ApplicationRecord
  # Relationships
  belongs_to :user

  def body=(value)
    self.custom_body = value
  end

  def body
    custom_body.presence || I18n.t('reminder.default_body', name: self.user.name)
  end
end

控制器脚手架非常标准,工作正常。以下是更新操作:

  # PATCH/PUT /reminders/1
  def update
    if @reminder.update(reminder_params)
      render json: @reminder
    else
      render json: @reminder.errors, status: :unprocessable_entity
    end
  end

以下是列入白名单的参数:

# Only allow a trusted parameter "white list" through.
def reminder_params
  params.require(:reminder).permit( :id, :user_id, :subject, :greeting, :body, :is_follow_up)
end

问题是默认返回正常,但是当用户提交'body'时它不会持久存入'custom_body',我认为这是通过这种方法解决的:

  def body=(value)
    self.custom_body = value
  end

它适用于this gorails演员(见10分钟),所以我错过了什么?

1 个答案:

答案 0 :(得分:0)

万一其他人偶然发现这个问题,Rails代码是正确的。

这里的问题是强大的参数。在控制器中注意要求:

def reminder_params
  params.require(:reminder).permit( :id, :user_id, :subject, :greeting, :body, :is_follow_up)
end

因此,补丁请求的json正文必须按以下方式构造:

{“提醒”:   {......所有领域..​​....} }

客户端只是发送一个字段列表,而不是将它们放在“提醒”对象中。

例如,它必须是这样的:

Parameters: 
{"reminder"=>
  {"subject"=>"your checklist reminder!", 
   "greeting"=>"Hi", 
   "body"=>"\nThis is a quick reminder about the outstanding items still on your checklist.\n\nPlease click the button below to review the items we're still waiting on.\n\nThank you,\n\nRichard Owner",
   "id"=>"33b29a76-298f-4ef2-a76a-ca4438c6d1ce"
  }
}