我有一个模型,它在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分钟),所以我错过了什么?
答案 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"
}
}