W moim projekcie korzystam z Rails 5.1.4 i simple_form, mam takie dwa modele:
class Reservation < ApplicationRecord
has_one :stretch, dependent: :destroy
has_many :reservation_additional_services
has_many :additional_services, through: :reservation_additional_services
belongs_to :user
enum status: [:submitted, :cancelled, :confirmed, :altered, :finished]
accepts_nested_attributes_for :stretch, reject_if: proc { |attributes| attributes.all? { |key, value| value.blank? }}
# validates :stretch, presence: true
validates :additional_service_ids, presence: true
end
class Stretch < ApplicationRecord
belongs_to :reservation
validates :start_date, :end_date, presence: true
end
kontroller jeżeli chodzi o stretch_attributes to próbowałem już różnych rzeczy i dodałem też id bo myślałem, że może jego brak jest problemem:
class ReservationsController < ApplicationController
def index
@reservations = current_user.reservations
end
def new
@reservation = Reservation.new
@reservation.build_stretch
@reservation.additional_services.build
end
def create
@reservation = Reservation.new(reservation_prams)
@reservation.user = current_user
if @reservation.save
redirect_to reservations_url
else
@reservation.build_stretch unless @reservation.stretch.present?
@reservation.additional_services.build unless @reservation.additional_services.present?
render :new, status: :not_acceptable
end
end
private
def reservation_prams
params.require(:reservation).permit(
stretch_attributes: [:id, :start_date, :end_date],
additional_service: [:id, :name, :price]
)
end
def stay_params
end
end
i partial formularza:
= simple_form_for(@reservation) do |f|
.row
= f.simple_fields_for :stretch do |sf|
= sf.hidden_field :id
= sf.input :start_date, as: :string
= sf.input :end_date, as: :string
.row
= f.submit
Walidacja działa tzn formularz nie przechodzi i rezerwacja nie jest tworzona, ale przy nie wypełnieniu pól, nie wyświetlają się błędy walidacji, a po wyświetleniu @reservation.stretch w widoku widać, że za każdym razem jest tworzony nowy obiekt.
EDIT
Błędy walidacji pojawiają się jak jedno z pól jest wypełnione: