(Rails 5.2)我的JSON记录已在CREATE上正确保存到(Postgres 9.4)数据库中,但在UPDATE之后重新格式化,回车符(\ r)和换行符(\ n)显示在数据库中更新。
:budget_json 列是 jsonb 类型。
这是我的(简化的)预算模型:
class Budget < ApplicationRecord
after_initialize :create_shell_json
def create_shell_json
self.budget_json = blank_budget if self.new_record?
end
def blank_budget
{
id: nil,
name: nil,
year: nil,
[etc...]
}
end
end
这是我的控制人:
def new
@budget = Budget.new(year: Time.now.year)
end
def create
@budget = Budget.new(budget_params)
@budget.budget_json = JSON.parse(budget_params[:budget_json])
if @budget.save
redirect_to admin_budgets_path, notice: "Budget successfully created."
else
render :new
end
end
def edit
@budget = Budget.find(params[:id])
end
def update
@budget = Budget.find(params[:id])
@budget.budget_json = JSON.parse(budget_params[:budget_json])
if @budget.update(budget_params)
redirect_to admin_budgets_path, notice: "Budget successfully updated."
else
render :edit
end
end
这是表格的相关部分。 (CREATE和UPDATE的形式相同。)如果用户要修改默认值,则TEXTAREA包含可编辑的JSON:
<%= form_with model: [:admin, @budget], local: true, :html => {:class => "form-horizontal"} do |f| %>
...
<div class="form-group">
<div class="col-sm-2">
<%= f.label :budget_json %>
</div>
<div class="col-sm-2">
<%= text_area_tag "budget[budget_json]", JSON.pretty_generate(@budget.budget_json), id: "budget_budget_json" %>
</div>
</div>
...
<% end %>
FWIW,表单如下:
从pgAdmin中可以看到,第一条记录(id:166)是干净且可用的。它只是刚刚创建。第二条记录(id:167)不可用,因为它已存储为字符串:
我想念什么?
答案 0 :(得分:0)
Jeez。整篇文章多久能帮助您更清晰地思考!我有答案:在UPDATE动作中,我实际上并没有使用JSON.parsed版本的参数。通过更改
if @budget.update(budget_params)
到
if @budget.save(budget_params)
一切正常。
话虽如此,如果有人能够提出一种更优雅的方式来编码这些(管理界面)JSON数据往返行程,我将很高兴听到您的建议。