ich eine has_many durch Bezug für Reservierung und AdditionalService Modelle haben:Rails 5.1.4 und cancancan Unzulässige Parameter auf Update
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
Ich habe meine ReservationsController wie folgt definiert bekam:
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
ich benutze eine regelmäßige Art von Form und wenn ich versuche, zusätzlichen Service in ausgewählten zu ändern und einreichen, ändert sich nichts und im Server erhalte ich diese Ausgabe:
**************************
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>
Ich weiß nicht, was falsch ist, weil alles, was für das andere Modell funktioniert, die von Reservation erbt - Reservation::Stay
hier ist Controller dafür:
= 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();