2017-09-28 2 views
0

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(); 

Antwort

0

Eigentlich:

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 

Da meine Form ist Ich hatte einen kleinen Tippfehler in reservation_params Methodenname und das war das ganze Problem.

Verwandte Themen