Rails 5 - Запрещенные Атрибуты - PullRequest
0 голосов
/ 01 мая 2020

Rails выдает ошибку при попытке создать, когда я добавил все атрибуты в нужную функцию и сослался на нее в нужных местах (насколько я знаю). Может успешно обновить. Это происходит через несколько контроллеров, к сожалению. Я предполагаю, что проблема одинакова для всех из них.

Это часть обновления до рельсов 5, ранее рельсов 2. Ruby версия: 2.6.3

Функция создания:

def create
    @shipment_method = ShipmentMethod.new(shipment_methods_params)
    respond_to do |format|
      if @shipment_method.save
        format.html { redirect_to shipment_methods_url, notice: 'Shipment method was successfully created.' }
        format.json { render json: @shipment_method, status: :created, location: @shipment_method }
      else
        format.html { render action: "new" }
        format.json { render json: @shipment_method.errors, status: :unprocessable_entity }
      end
    end
  end

Функция Params:

def shipment_methods_params
    params.require(:shipment_method).permit(:name, :description, :shipping_url, :active, :supports_tracking, :requires_phone)
  end

Параметры запроса:

Request parameters  
{"utf8"=>"✓", "authenticity_token"=>"KjPFsCA5xwgeIx4U3eOH4sA1IuYY5FSw6kvK16XyyKarEzlxSi6N04LFBdsJHWyIwt+ujv6gz9D+flYBeJ+pWA==", "shipment_method"=>{"name"=>"1", "description"=>"1", "shipping_url"=>"1", "active"=>"0", "supports_tracking"=>"0", "requires_phone"=>"0"}, "commit"=>"Create Shipment method", "controller"=>"shipment_methods", "action"=>"create"}

Журнал сервера для запроса:

Processing by ShipmentMethodsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"KjPFsCA5xwgeIx4U3eOH4sA1IuYY5FSw6kvK16XyyKarEzlxSi6N04LFBdsJHWyIwt+ujv6gz9D+flYBeJ+pWA==", "shipment_method"=>{"name"=>"1", "description"=>"1", "shipping_url"=>"1", "active"=>"0", "supports_tracking"=>"0", "requires_phone"=>"0"}, "commit"=>"Create Shipment method"}
  User Load (0.6ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 5 ORDER BY `users`.`id` ASC LIMIT 1
Completed 500 Internal Server Error in 4ms (ActiveRecord: 0.6ms)



ActiveModel::ForbiddenAttributesError - ActiveModel::ForbiddenAttributesError:

Полный класс:

class ShipmentMethod < ActiveRecord::Base
  # public :description, :active, :name, :requires_phone, :supports_tracking, :shipping_url

  ## Associations
  has_many :shipments

  ## Validations
  validates :name, presence: true, uniqueness: true

  ## Scopes
  default_scope -> {order(:name)}
  scope :active, -> {where("active = 1")}
end

1 Ответ

0 голосов
/ 05 мая 2020

Если в ваших контроллерах есть load_and_authorize_resource перед действием, то происходит то, что метод принимает ваши параметры и пытается создать экземпляр до того, как он попадет в метод. Следовательно, он игнорирует сильные параметры, которые вы создали.

Так что, конечно, он никогда не достигнет метода и БАМа - страшного FAE .

Одним из способов является настроить действия перед ...

  load_and_authorize_resource :shipment_method, except: [:create]
  authorize_resource :shipment_method, only: [:create] 

Но это очень скучно.

Другой вариант - изменить имя метода ваших сильных параметров на shipment_method_params ...

def shipment_method_params
    params.require(:shipment_method).permit(:name, :description, :shipping_url, :active, :supports_tracking, :requires_phone)
  end

Потому что Rails и его любовь к соглашениям. Вы также можете сделать отдельные create_params и update_params, если у вас есть разные параметры для этих действий.

...