Rails 5.2: как создать fields_for для каждого значения ключа I18n? - PullRequest
0 голосов
/ 31 марта 2019

В моем _form.html.erb у меня есть вложенные поля, где для предложения я хотел бы сохранить несколько типов скидок со значениями:

<%= f.fields_for @offer.discounts do |discount| %>
  <% I18n.t(:discount_type).each do |type| %>
     <div class="form-group row discount-list">
       <label class="col-sm-8 control-label">
          <%= discount.label I18n.t("discount_type.#{type[0]}") %><br/>
       </label>
       <div class="col-sm-4">
         <%= discount.hidden_field :discount_type, value: type[0] %>
         <%= discount.number_field :value, 
             value: (@offer.new_record? ? '0.00' : discount.value), 
             class: "form-control allow_numeric" %>
      </div>
    </div>
  <% end %>
<% end %>

На данный момент моя форма заполнена правильно, как я хотел бы, однако значения не сохраняются, так как:

  1. в своих параметрах я вижу только 1 из 3 типов скидок: "seller_discount"=>{"discount_type"=>"special", "value"=>"5"}
  2. есть ошибка Unpermitted parameter: :seller_discount
  3. записи не сохраняются

Моя Seller::Offer модель выглядит так:

has_many :offer_discounts, class_name: "Seller::OfferDiscount"
has_many :discounts, class_name: "Seller::Discount", through: :offer_discounts, inverse_of: :offers
accepts_nested_attributes_for :discounts, allow_destroy: true

Мой контроллер прост как:

  def new
    @offer = Seller::Offer.new
  end

  private

  def offer_params
    params.require(:seller_offer).permit(
      :company_id, :name, :base_price,
      discounts_attributes: [:id, :discount_type, :value, :_destroy]
    )
  end

До сих пор я пробовал разные идеи из Rails docs , однако не повезло. Возможно, в моем конкретном случае в твисте я пытаюсь перебрать I18n.t(:discount_type) поле ввода ввода для каждого типа скидки (ключ покупки).

Я буду рад любому совету, как решить эту проблему. Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

Итак, чтобы моя форма работала как для новых, так и для редактируемых действий, окончательное решение таково:

        <% if params[:action] == 'new' %>
        <div class="col-md-7 col-sm-7">
        <!-- Discounts for new form !-->
          <% I18n.t(:discount_type).each do |type| %>
          <%= f.fields_for :discounts, @offer.discounts.build do |disc| %>
              <div class="form-group row discount-list">
                <label class="col-sm-8 control-label">
                  <%= disc.label I18n.t("discount_type.#{type[0]}") %><br/>
                </label>
                <div class="col-sm-4">
                  <%= disc.hidden_field :discount_type, value: type[0] %>
                  <%= disc.number_field :value, value: '0.00',
                      class: "form-control allow_numeric" %>
                </div>
              </div>
            <% end %>
          <% end %>
        </div>
        <% elsif params[:action] == 'edit' %>
        <div class="col-md-7 col-sm-7">
        <!-- Discounts for edit form !-->
        <%= f.simple_fields_for :discounts do |d| %>
          <div class="form-group row discount-list">
            <%= d.input :discount_type, as: :hidden %>
            <label class="col-sm-8 control-label">
              <%= d.label I18n.t("discount_type.#{d.object.discount_type}") %><br/>
            </label>
            <div class="col-sm-4">
              <%= d.input :value, label: false, input_html: { id: d.object.discount_type+"_discount",
                  class: "form-control allow_numeric" } %>
            </div>
          </div>
        <% end %>
        </div>
      <% end %>

Действие редактирования выполняется с simple_form_fields_for

Очевидно, не блестящее решение, но похоже, что это работает.

0 голосов
/ 31 марта 2019

Так как вы перебираете discount_type, я думаю, это должен быть тип массива в вашем offer_params методе.

def offer_params
  params.require(:seller_offer).permit(
    :company_id, :name, :base_price,
    seller_discounts_attributes: [:id, :discount_types => [:discount_type, :value], :_destroy]
  )
end

Но что произойдет, если вы попытаетесь использовать fields_for помощник?

<%= f.fields_for @offer.discounts do |discount| %>
  <%= f.fields_for I18n.t(:discount_type) do |type| %>
     <div class="form-group row discount-list">
       <label class="col-sm-8 control-label">
          <%= discount.label I18n.t("discount_type.#{type[0]}") %><br/>
       </label>
       <div class="col-sm-4">
         <%= discount.hidden_field :discount_type, value: type[0] %>
         <%= discount.number_field :value, 
             value: (@offer.new_record? ? '0.00' : discount.value), 
             class: "form-control allow_numeric" %>
      </div>
    </div>
  <% end %>
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...