Моя дилемма существует уже неделю, я пытаюсь ее решить, но пока не могу, поэтому я прошу помощи.
У меня есть модель дилерского центра и другие вложенные(DealershipsSetting, Address, Machines, Operators, Cards), где отношение has_one применяется только к DealershipsSetting, поэтому остальные имеют has_many.Я могу только записать некоторую информацию в таблицы базы данных, когда я вызываю метод построения для каждой модели вложенных форм, например:
def new
@dealership = Dealership.new
@ dealership.build_dealerships_setting if @ dealership.dealerships_setting.blank?
@ dealership.addresses.build if @ dealership.addresses.blank?
...
end
def edit
@ dealership.build_dealerships_setting if @ dealership.dealerships_setting.blank?
@ dealership.addresses.build if @ dealership.addresses.blank?
...
end
Я понимаю:
a) ПервыйВ журнале я замечаю, что формы перенаправляются несколько раз.Это имеет смысл, так как я заставляю их строить через вызов builds (по крайней мере, я так понимаю).Но это не стандартное поведение при использовании драгоценного камня, я протестировал в другом приложении, чтобы узнать, как использовать драгоценный камень, следуя документации https://github.com/nathanvda/cocoon
б) Из-за вызова метода сборки,формы открываются (готовы к приему данных), я не знаю, является ли это поведением по умолчанию.
c) Когда я вызываю Action New или Edit, я не могу записать более одной записи (тип, 2адреса, 3 карты или N операторов)
d) В документации я не заметил никакого вызова метода сборки, я нашел в поисках, чтобы попытаться решить мою проблему, например, https://share.atelie.software/rails-nested-attributes-com-has-many-42ecf6179871
e) Если я удаляю вызовы из сборок, следуя примерам, доступным в документации, поля будут скрыты до тех пор, пока вы не вызовете через link_to_add_association, но никакие данные из вложенных форм не сохранятся.
Когда я настраиваю свой дилерский центр вот так, я не могу добавить регистр в базу данных:
def new
@dealership = Dealership.new
end
...
def create
@dealership = Dealership.new(dealership_params)
respond_to do |format|
if @dealership.save
format.html { redirect_to users_backend_dealerships_path, notice: 'Dealership was successfully created.' }
format.json { render :show, status: :created, location: @dealership }
else
format.html { render :new }
format.json { render json: @dealership.errors, status: :unprocessable_entity }
end
end
end
....
def dealership_params
params.require(:dealership).permit(
:fantasy_name, :social_name, :cpf, :cnpj, :municipal_registration, :state_registration, :credit, :phone, :manager_email, :is_available, :credits_package_id, dealerships_setting_attributes: [:id, :credit_alert, :contract_validity, :franchise_for_rent, :due_date, :credit_value, :is_available, :_destroy],addresses_attributes: [:id, :place, :neighborhood, :cep, :state, :city, :is_available, :_destroy], machines_attributes: [:id, :name, :model, :serial_number, :mac_address, :calibration_counter, :is_available, :_destroy], operators_attributes: [:id, :name, :cpf, :card, :is_available, :_destroy ], cards_attributes: [:id, :serial, :category, :credit_package, :client, :machine, :operator, :is_available, :_destroy ])
end
Таким образом, я могу добавить один регистр по модели в базе данных..
дилерский центр_контроллер
class UsersBackend :: DealershipsController <UsersBackendController
before_action: set_dealership, only: [: show,: edit,: update,: destroy]
before_action: get_credit_packages, only: [: edit,: update,: new]
def index
@dealerships = Dealership.includes(:dealerships_setting, :addresses, :machines, :operators, :cards)
end
def show
end
def add_credits
end
def new
@dealership = Dealership.new
@dealership.build_dealerships_setting if @dealership.dealerships_setting.blank?
@dealership.addresses.build if @dealership.addresses.blank?
@dealership.machines.build if @dealership.machines.blank?
@dealership.operators.build if @dealership.operators.blank?
@dealership.cards.build if @dealership.cards.blank?
end
def edit
@dealership.build_dealerships_setting if @dealership.dealerships_setting.blank?
@dealership.addresses.build if @dealership.addresses.blank?
@dealership.machines.build if @dealership.machines.blank?
@dealership.operators.build if @dealership.operators.blank?
@dealership.cards.build if @dealership.cards.blank?
end
def create
@dealership = Dealership.new(dealership_params)
respond_to do |format|
if @dealership.save
format.html { redirect_to users_backend_dealerships_path, notice: 'Dealership was successfully created.' }
format.json { render :show, status: :created, location: @dealership }
else
format.html { render :new }
format.json { render json: @dealership.errors, status: :unprocessable_entity }
end
end
end
def update
respond_to do |format|
if @dealership.update(dealership_params)
format.html { redirect_to users_backend_dealerships_path, notice: 'Dealership was successfully updated.' }
format.json { render :show, status: :ok, location: @dealership }
else
format.html { render :edit }
format.json { render json: @dealership.errors, status: :unprocessable_entity }
end
end
end
def destroy
@dealership.destroy
respond_to do |format|
format.html { redirect_to users_backend_dealerships_path, notice: 'Dealership was successfully destroyed.' }
format.json { head :no_content }
end
end
private
def set_dealership
@dealership = Dealership.find(params[:id])
end
def dealership_params
params.require(:dealership).permit(:fantasy_name, :social_name, :cpf, :cnpj, :municipal_registration, :state_registration, :credit, :phone, :manager_email, :is_available, :credits_package_id,
dealerships_setting_attributes: [:id, :credit_alert, :contract_validity, :franchise_for_rent, :due_date, :credit_value, :is_available, :_destroy],
addresses_attributes: [:id, :place, :neighborhood, :cep, :state, :city, :is_available, :_destroy],
machines_attributes: [:id, :name, :model, :serial_number, :mac_address, :calibration_counter, :is_available, :_destroy],
operators_attributes: [:id, :name, :cpf, :card, :is_available, :_destroy ],
cards_attributes: [:id, :serial, :category, :credit_package, :client, :machine, :operator, :is_available, :_destroy ]
)
end
def get_credit_packages
@credit_packages = CreditsPackage.where(media_owner: 0)
end
end
модель дилерского центра.рб
class Dealership < ApplicationRecord
has_many :credits_packages
has_one :dealerships_setting, dependent: :destroy, inverse_of: :dealership
has_many :addresses, dependent: :destroy, inverse_of: :dealership
has_many :machines, dependent: :destroy, inverse_of: :dealership
has_many :operators, dependent: :destroy, inverse_of: :dealership
has_many :cards, dependent: :destroy, inverse_of: :dealership
accepts_nested_attributes_for :dealerships_setting, reject_if: :all_blank, allow_destroy: true
accepts_nested_attributes_for :addresses, reject_if: :all_blank, allow_destroy: true
accepts_nested_attributes_for :machines, reject_if: :all_blank, allow_destroy: true
accepts_nested_attributes_for :operators, reject_if: :all_blank, allow_destroy: true
accepts_nested_attributes_for :cards, reject_if: :all_blank, allow_destroy: true
accepts_nested_attributes_for :users, reject_if: :all_blank, allow_destroy: true
end
модель дилерского центра_наладка
class DealershipsSetting < ApplicationRecord
belongs_to :dealership, inverse_of: :dealerships_setting
end
модель адреса.рб
class Address < ApplicationRecord
belongs_to :dealership
end
form.html.erb (представительство)
<%= form_with(model: [ :users_backend, @dealership], local: true) do |form| %>
<div class="form-group">
<strong><%= form.label :fantasy_name %></strong>
<%= form.text_field :fantasy_name, autofocus: true, class:"text-uppercase form-control", placeholder:t('place_holders.fantasy_name') %>
</div>
...
<%= form.fields_for :dealerships_setting, @dealership.dealerships_setting do |dealerships_setting| %>
<%= render partial: 'dealerships_setting_fields', locals: { f: dealerships_setting } %>
<% end %>
<div id="addresses">
<%= form.fields_for :addresses do |address| %>
<%= render partial: 'address_fields', locals: { f: address } %>
<% end %>
<%= link_to_add_association('Add address', form, :addresses) %>
</div>
....others nested forms...
_dealerships_setting_fields.html.erb
<div class="nested-fields">
<div class="form-group">
<strong><%= f.label :contract_validity %></strong>
<%= f.text_field :contract_validity, class:"form-control ", placeholder:t('place_holders.contract_validity') %>
</div> ...another fields...
_address_fields.html.erb
<div class='nested-fields'>
<div class='form-group'>
<strong><%= f.label :place %></strong>
<%= f.text_field :place, class:"text-uppercase form-control", placeholder:t('place_holders.place') %>
</div> ...another fields...
Чтонужно ли мне?О - Управляйте дилерскими центрами, где у них должна быть одна конфигурация и один или несколько адресов, машин, операторов и карт.
Я буду очень благодарен всем, кто может мне помочь.