簡體   English   中英

Rails 5.1.4和cancancan更新時不允許的參數

[英]Rails 5.1.4 and cancancan Unpermitted parameters on update

我有一個has_many通過Reservation和AdditionalService模型的關系:

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

我已經定義了我的ReservationsController:

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

我使用一種常規形式,當我嘗試更改選擇和提交中的其他服務時,沒有任何變化,並且在服務器中我得到以下輸出:

**************************
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>

我不知道這是怎么回事,因為所有內容都適用於從Reservation- Reservation::Stay繼承的另一個模型:

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

有我的表格:

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

實際上,我在reservation_params方法名稱中有一個小錯字,這就是整個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM