Rails:从数据库到TEXTAREA的JSON往返在第二次保存时转换为字符串

时间:2018-09-14 03:58:26

标签: ruby-on-rails json

(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,表单如下:

Screenshot of TEXTAREA as rendered in the form

从pgAdmin中可以看到,第一条记录(id:166)是干净且可用的。它只是刚刚创建。第二条记录(id:167)不可用,因为它已存储为字符串:

Screenshot of database showing two records

我想念什么?

1 个答案:

答案 0 :(得分:0)

Jeez。整篇文章多久能帮助您更清晰地思考!我有答案:在UPDATE动作中,我实际上并没有使用JSON.parsed版本的参数。通过更改

if @budget.update(budget_params)

if @budget.save(budget_params)

一切正常。

话虽如此,如果有人能够提出一种更优雅的方式来编码这些(管理界面)JSON数据往返行程,我将很高兴听到您的建议。