J'ai un has_many par rapport aux modèles de réservation et AdditionalService:Rails 5.1.4 et paramètres cancancan sur la mise à jour
class Reservation < ApplicationRecord
has_one :stretch, dependent: :destroy
has_many :reservation_additional_services, dependent: :destroy
has_many :additional_services, through: :reservation_additional_services
belongs_to :user
enum status: [:submitted, :cancelled, :confirmed, :on_going, :altered, :finished]
accepts_nested_attributes_for :stretch
validates :additional_service_ids, presence: true, unless: ->(reservation) { reservation.is_a?(Reservation::Stay) }
def cancel!
self.cancelled!
end
def costs
additional_costs + additional_services.map(&:price).inject(0){|sum, x| sum + x}
end
end
class AdditionalService < ApplicationRecord
has_many :reservation_additional_services
has_many :reservations, through: :reservation_additional_services
end
J'ai mon ReservationsController défini comme ceci:
class ReservationsController < ApplicationController
load_and_authorize_resource except: [:index, :create]
def index
@reservations = current_user.reservations
end
def new
@reservation.build_stretch
end
def create
@reservation = Reservation.new(reservation_prams)
@reservation.user = current_user
@reservation.build_stretch unless @reservation.stretch.present?
if @reservation.save
redirect_to reservations_url
else
render :new, status: :not_acceptable
end
end
def edit
end
def update
puts "**************************"
p update_params
p params
if @reservation.update_attributes(update_params)
redirect_to reservations_url
else
render :edit, status: :not_acceptable
end
end
def destroy
@reservation.cancel!
redirect_to reservations_url
end
private
def reservation_prams
params.require(:reservation).permit(
stretch_attributes: [:start_date, :end_date],
additional_service_ids: []
)
end
def update_params
params.require(:reservation).permit(
additional_service_ids: []
)
end
end
J'utilise un type régulier de formulaire et quand j'essaie de changer de service supplémentaire dans select et submit, rien ne change et dans le serveur j'obtiens cette sortie:
**************************
Unpermitted parameters: :stretch_attributes, :additional_service_ids
<ActionController::Parameters {} permitted: true>
<ActionController::Parameters {"utf8"=>"✓", "_method"=>"patch", "authenticity_token"=>"RFTlG91gWUVOLTTEn/319D1v1d+bmTc+sjhnXFlFUSdHwxZXCjpCRM+1fsYYLhHqyhk7w5dtYXZZrN3X0WqHeA==", "reservation"=><ActionController::Parameters {"stretch_attributes"=>{"start_date"=>"2017-01-12 00:00:00 UTC", "end_date"=>"2017-01-14 00:00:00 UTC", "id"=>"1"}, "additional_service_ids"=>"3"} permitted: false>, "commit"=>"Zarezerwuj", "controller"=>"reservations", "action"=>"update", "id"=>"1"} permitted: false>
Je ne sais pas quel est le problème parce que tout ne fonctionne pour l'autre modèle qui hérite de la réservation - Reservation::Stay
ici est contrôleur pour que:
class StaysController < ApplicationController
load_and_authorize_resource :reservation, parent: false, class: Reservation::Stay, except: [:create]
def new
@reservation.build_stretch
render '/reservations/new'
end
def create
@reservation = Reservation::Stay.new(stay_params)
@reservation.user = current_user
@reservation.build_stretch unless @reservation.stretch.present?
if @reservation.save
redirect_to reservations_url
else
render '/reservations/new', status: :not_acceptable
end
end
def update
if @reservation.update_attributes(update_params)
@reservation.altered!
redirect_to reservations_url
else
render '/reservations/edit', status: :not_acceptable
end
end
private
def stay_params
params.require(:reservation_stay).permit(
stretch_attributes: [:start_date, :end_date],
additional_service_ids: [],
room_ids: []
)
end
def update_params
params.require(:reservation_stay).permit(
additional_service_ids: []
)
end
end
Il est ma forme:
= simple_form_for(@reservation,
defaults: { label: false }) do |f|
.row
= f.simple_fields_for :stretch do |sf|
= sf.input :start_date, as: :string, label: t('.labels.start_date'), input_html: { class: 'datepicker' }
= sf.input :end_date, as: :string, label: t('.labels.end_date'), input_html: { class: 'datepicker' }
- if @reservation.is_a?(Reservation::Stay)
= f.input :additional_service_ids,
as: :select, input_html: { multiple: true }, label: t('.labels.additional_service'),
collection: AdditionalService.all.collect {|as| ["#{as.name} - #{as.price}", as.id] }
= f.input :room_ids,
as: :select,
input_html: { multiple: true },
label: t('.label.rooms'),
collection: Room.all.collect{ |room| ["#{room.number}", room.id]}
- else
= f.input :additional_service_ids,
as: :select,
collection: AdditionalService.all.collect {|as| ["#{as.name} - #{as.price}", as.id] }
.row
= f.submit t('.labels.book')
javascript:
Reservations.initForm();