Условное сохранение данных field_for в Rails - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть приложение rails, в котором есть модель клиента и модель адреса. У клиента может быть много адресов. Я создал форму, которая использует field_for, чтобы пользователи могли вводить данные клиента и адрес в одной форме. Вот модели

customer.rb

class Customer < ApplicationRecord
    has_many :addresses, dependent: :destroy
    accepts_nested_attributes_for :addresses
end

address.rb

class Address < ApplicationRecord
  belongs_to :customer

  validates :atype, presence: true


  ADDRESSTYPE = %w(Billing Delivery Postal)
    validates :atype, inclusion: { in: ADDRESSTYPE }
end

А вот и форма.

<%= form_with(model: customer, local: true) do |f| %>
  <%= f.label :firstname %>
  <%= f.text_field :firstname %>
  <%= f.label :surname %>
  <%= f.text_field :surname %>
  <%= f.label :location %>
  <%= f.text_field :location %>
  <%= f.label :email %>
  <%= f.email_field :email %>
  <%= f.label :mobile_number %>
  <%= f.text_field :mobile_number %>
  <%= f.label :company %>
  <%= f.text_field :company_name_legacy %>
  <%= f.fields_for :addresses do |address| %>
        <%= address.label :address_type %>
        <%= address.select :atype, Address::ADDRESSTYPE %>
        <%= address.label :address_line_1 %>
        <%= address.text_field :line_1 %>
        <%= address.label :address_line_2 %>
        <%= address.text_field :line_2 %>
        <%= address.label :city %>
        <%= address.text_field :city %>
        <%= address.label :state %>
        <%= address.text_field :state %>
        <%= address.label :postcode %>
        <%= address.text_field :postcode %>
        <%= address.label :country %>
        <%= address.text_field :country %>     
   <% end %> 
  <%= f.submit %>
<% end %>

Мой контроллер для сохранение нового клиента происходит следующим образом:

def new
        @customer = Customer.new
        @customer.addresses.build
    end

    def create
        @customer = Customer.new customer_params
        @customer.save

        redirect_to @customer
    end

Я бы хотел предотвратить сохранение адреса, если строка_1 адреса пуста. Я не могу понять, как проверить, является ли он пустым или как предотвратить его сохранение как часть сохранения клиента? Любой совет будет оценен!

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Хотя ответ @ Yakov является технически правильным, он покажет ошибку проверки, а иногда это нежелательно.

Если вы хотите сохранить клиента даже без адресов, вы можете добавить обратный вызов для клиента модально так:

before_save :mark_addresses_for_removal

def mark_addresses_for_removal
  addresses.each do |address|
    address.mark_for_destruction unless address.address_line_1?
  end
end

Это также приведет к удалению адреса при редактировании клиента, если текст address_line_1 очищен.

0 голосов
/ 06 февраля 2020

Вы можете добавить проверку к Address модели validates :atype, :line_1, presence: true, затем переписать create метод следующим образом:

def create
  @customer = Customer.new customer_params
  if @customer.save
    redirect_to @customer
  else
    render 'new'
  end
end

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

<% if @customer.errors.any? %>
  <ul>
    <% @customer.errors.full_messages.each do |message| %>
      <li><%= message %></li>
    <% end %>
  </ul>
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...