Rails: JSON туда и обратно из базы данных в TEXTAREA преобразуется в строку при втором сохранении - PullRequest
0 голосов
/ 14 сентября 2018

(Rails 5.2) Моя запись с JSON корректно сохраняется в базе данных (Postgres 9.4) на CREATE, но переформатируется после UPDATE, с возвратом каретки (\ r) и символами новой строки (\ n), появляющимися в базе данных после UPDATE.

Столбец : 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 голосов
/ 14 сентября 2018

Jeez. Как часто выписывая все это, вы мыслите более четко! У меня есть ответ: в действии UPDATE я фактически не использовал версию параметров JSON.parsed. Изменяя

if @budget.update(budget_params)

до

if @budget.save(budget_params)

все работает как надо.

Сказав, что, если кто-то сможет предложить более элегантный способ кодирования этих (административный интерфейс) циклических переходов для данных JSON, я буду рад выслушать ваши предложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...