Значения для вложенных полей не сохраняются без ошибок | Рельсы 5.2 - PullRequest
0 голосов
/ 12 ноября 2018

Я работаю над приложением Rails 5.2, требующим хранения Quote и одного QuoteLineItem с ним (Quote has_one :quote_line_item, QuoteLineItem belongs_to :quote). Я настроил все в соответствии с документацией, однако при отправке quotes#edit для (который содержит fields_for @quote.quote_line_item...) значения для записи Quote обновляются в базе данных, однако значения для QuoteLineItem не , При отправке не выдается никакой ошибки, а в журналах сервера нет сообщения «Unpermitted params ...».

Цитата Модель

class Quote < ApplicationRecord
  has_one :quote_line_item, inverse_of: :quote, dependent: :destroy
  accepts_nested_attributes_for :quote_line_item, update_only: true
end

QuoteLineItem Модель

class QuoteLineItem < ApplicationRecord
  belongs_to :quote, inverse_of: :quote_line_item, touch: true
end

Контроллер котировок

class QuotesController < ApplicationController
  def update
    @quote = Quote.find(params[:id])

    if @quote.update(quote_params)
      flash[:success] = "Quote was successfully updated."
      redirect_to @quote
    else
      flash[:error] = "Quote was not updated. Please try again."
      render :edit
    end
  end

  private
    def quote_params
      params.require(:quote).permit(:issued_at, quote_line_item_attributes: [ :kind, :description, :price ])
    end
end

Цитировать Редактировать Просмотр

<%= form_for @quote do |quote_form| %>
  <% if @quote.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@quote.errors.count, "error") %> prohibited this quote from being saved:</h2>

      <ul>
        <% @quote.errors.full_messages.each do |message| %>
          <li><%= message %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <%= quote_form.label :issued_at %>
  <%= quote_form.datetime_field :issued_at %>

  <%= fields_for :quote_line_item, @quote.quote_line_item do |quote_line_item_fields| %>
    <%= quote_line_item_fields.label :description %><br>
    <%= quote_line_item_fields.text_field :description %>

    <%= quote_line_item_fields.label :price %>
    <%= quote_line_item_fields.number_field :price, step: :any %>
  <% end %>
<% end %>

Журналы сервера

Started PATCH "/quotes/62" for 127.0.0.1 at 2018-11-12 13:01:46 +0800
Processing by QuotesController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"bVa+vhRayuPDhe5xkLcK2rm10zQ9oHvtDSZsKDhMBsdX/JDjf6uXsnIJ7gM/yP7Lt9E+aBGIR9WCoLU2uNhgVQ==", "quote"=>{"issued_at"=>"12/11/2018 11:05 AM"}, "quote_line_item"=>{"description"=>"QuoteLineItem description goes here...", "price"=>"800.00"}, "commit"=>"Save", "id"=>"62"}
  Quote Load (3.8ms)  SELECT  `quotes`.* FROM `quotes` WHERE `quotes`.`id` = 62 LIMIT 1
  ↳ app/controllers/quotes_controller.rb:127
   (0.7ms)  BEGIN
  ↳ app/controllers/quotes_controller.rb:53
   (3.6ms)  COMMIT
  ↳ app/controllers/quotes_controller.rb:53
Redirected to http://localhost:3000/quotes/62
Completed 302 Found in 44ms (ActiveRecord: 9.3ms)

Есть ли причина, по которой это не должно работать?

Спасибо.

1 Ответ

0 голосов
/ 12 ноября 2018

Попробуйте сослаться на quote_form перед вашим fields_for:

<%= form_for @quote do |quote_form| %>

  ...

  <%= quote_form.fields_for :quote_line_item do |quote_line_item_fields| %>
  #   ^ <- Add here

    ...

  <% end %>
<% end %>

После обновления проверьте, что параметры, передаваемые в quotes#edit, являются вложенными:

т.е.: "quote"=>{"issued_at"=>"12/11/2018 11:05 AM", "quote_line_item"=>{"description"=>"Line item description goes here...", "price"=>"200.00"}, "id"=>"63"}

...