Использование Globalize gem во вложенной форме с использованием Cocoon gem - PullRequest
0 голосов
/ 24 февраля 2020

Я использовал как Globalize gem, так и Cocoon gem, и все работало нормально. Однако, когда я пытаюсь использовать Globalize в cocoon nested form, я получаю сообщение об ошибке, которое не знаю, как решить.

Context

Я использую кокон для управления extra_guest_prices для extra_guest. Поскольку цены зависят от периода (например, высокий сезон отличается от низкого сезона), я использую cocoon, чтобы создать extra_guest_prices для разных периодов. Все хорошо работает с cocoon gem до этого момента.

Цель Используя globalize gem, я пытаюсь вставить спецификацию c name в отдельном language для extra_guest_price. Цель - показать поле ввода name для 3 доступных языков.

Ошибка К сожалению, я получаю следующие сообщения об ошибках: браузер

no implicit conversion of Integer into String

Extracted source (around line #45):              
      def globalize_fields_for(locale, *args, &proc)
        raise ArgumentError, "Missing block" unless block_given?
        45. @index = @index ? @index + 1 : 1
        object_name = "#{@object_name}[translations_attributes][#{@index}]"
        object = @object.translations.find_by_locale locale.to_s
        @template.concat @template.hidden_field_tag("#{object_name}[id]", object ? object.id : "")

консоль

ActionView::Template::Error (no implicit conversion of Integer into String):
     5: 
     6:       <!-- test -->
     7:       <div class="globalize-en globalize" id="en">
     8:         <%= f.globalize_fields_for locale do |ff| %>
     9:           <div class="row">
    10:             <% ff.text_field :locale, as: :hidden, :input_html => { :value => 'en' } %>
    11:             <div class="col-2">

config/initializers/globalization.rb:45:in `+'
config/initializers/globalization.rb:45:in `globalize_fields_for'

Код

моделей

class ExtraGuest < ApplicationRecord
  belongs_to :age_table
  has_many :extra_guest_prices, dependent: :destroy, inverse_of: :extra_guest
  accepts_nested_attributes_for :extra_guest_prices, allow_destroy: true
  validates :age_table, presence: true
end


class ExtraGuestPrice < ApplicationRecord
  belongs_to :extra_guest
  translates :name, :fallbacks_for_empty_translations => true
  accepts_nested_attributes_for :translations, allow_destroy: true
end

extra_ghest_controller

  def new
    @room_category = RoomCategory.find(params[:room_category_id])
    @extra_guest = ExtraGuest.new
    authorize @extra_guest
    @age_table_list = AgeTable.where(park: @room_category.park)
  end

  def extra_guest_params
    params.require(:extra_guest).permit(:name, :age_table_id,
      extra_guest_prices_attributes: [:id, :name, :price_type, :start_date, :end_date, :price, :duration, :duration_min, :duration_max, :backend_only, :weekend_extra, :_destroy,
      translations_attributes: [:id, :_destroy, :locale, :name]])
  end

views / extra_ghest / new

<div class="form-container col-12">
  <%= simple_form_for [@room_category, @age_table, @extra_guest] do |f|%>
  <div class="options-form">

  <div class="options-form-item">
    <h4 class="p-3"><%= t('.guest_title') %></h4 class="m-3">
  <div class="row">
    <div class="col col-lg-10">
      <%= f.association :age_table, prompt: t('.placeholder_age_table'), :collection => @age_table_list,value_method: :id, label_method: false %>
    </div>
  </div>
  </div>

  <div class="options-form-item">
  <h4 class="p-3"><%= t('.guest_price_title') %></h4 class="m-3">
    <%= f.simple_fields_for :extra_guest_prices do |price| %>
    <div class="reservation-details">
      <%= render 'extra_guest_price_fields', f: price %>
    </div>
    <% end %>
    <div>
      <%= link_to_add_association f, :extra_guest_prices do %>
      <div class="option-add-option-price">
        <div class="prices-border">
          <i class="fas fa-plus"></i> <%= t('.add_period') %>
        </div>
      </div>
      <% end %>
    </div>
    <div class="row">
      <div class="col col-lg-6"> <%= f.button :submit, t('.save_price_button'), class: "create-reservation-btn"%>
      </div>
    </div>
    <% end %>
  </div>
</div>
</div>
</div>

views / extra_guest_price_fields

<div class="nested-fields border-bottom">
    <div class="row">
<!-- test -->
      <div class="globalize-en globalize" id="en">
        <%= f.globalize_fields_for 'en' do |ff| %>
          <div class="row">
            <% ff.text_field :locale, as: :hidden, :input_html => { :value => 'en' } %>
            <div class="col-2">
              <%= flag_icon(:gb) %>
            </div>
            <div class="col-10">
              <div class="form-group">
                <label class="form-control-label text required" for="room_category_description">Name</label>
                <div><%= ff.text_field :name, :rows =>"1",  class:"form-control is-valid text required" %>
                </div>
              </div>
            </div>
          </div>

          <% end %>
        </div>

      <!-- test -->
      <div class="globalize-nl globalize" id="nl">
        <%= f.globalize_fields_for 'nl' do |ff| %>
          <div class="row">
            <% ff.text_field :locale, as: :hidden, :input_html => { :value => 'nl' } %>
            <div class="col-2">
              <%= flag_icon(:nl) %>
            </div>
            <div class="col-10">
              <div class="form-group">
                <label class="form-control-label text required" for="room_category_description">Name</label>
                <div><%= ff.text_field :name, :rows =>"1",  class:"form-control is-valid text required" %>
                </div>
              </div>
            </div>
          </div>

          <% end %>
        </div>

      <!-- test -->
      <div class="globalize-fr globalize" id="fr">
        <%= f.globalize_fields_for 'fr' do |ff| %>
          <div class="row">
            <% ff.text_field :locale, as: :hidden, :input_html => { :value => 'fr' } %>
            <div class="col-2">
              <%= flag_icon(:fr) %>
            </div>
            <div class="col-10">
              <div class="form-group">
                <label class="form-control-label text required" for="room_category_description">Name</label>
                <div><%= ff.text_field :name, :rows =>"1",  class:"form-control is-valid text required" %>
                </div>
              </div>
            </div>
          </div>
          <% end %>
        </div>
        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12 option-price-delete">
      <%= link_to_remove_association f do %>
      <i class="fas fa-trash"><%= t('.delete_price') %></i>
      <% end %>
    </div>
      </div>
    </div>
      ....

initializer / globalization.rb

module ActionView
  module Helpers
    class FormBuilder
          def globalize_fields_for(locale, *args, &proc)
        raise ArgumentError, "Missing block" unless block_given?
        @index = @index ? @index + 1 : 1
        object_name = "#{@object_name}[translations_attributes][#{@index}]"
        object = @object.translations.find_by_locale locale.to_s
        @template.concat @template.hidden_field_tag("#{object_name}[id]", object ? object.id : "")
        @template.concat @template.hidden_field_tag("#{object_name}[locale]", locale)
        @template.fields_for(object_name, object, *args, &proc)
      end
    end
  end
end
...