Я пытаюсь создать модель в контроллере, используя сильные параметры в Rails 5.1 (некоторые вещи изменились по сравнению с предыдущими для strong_params). Однако, когда я проверяю параметры, объединенных НЕТ, и я получаю ForbiddenAttributesError, отслеживающий строку Model.new ниже. Единственное, что в модели, это проверить наличие всех атрибутов.
class ModelController < ApplicationController
before_action :application_controller_action
def create
@model = Model.new(strong_params)
if @model.valid?
result = @model.save
else
render html: 'MODEL NOT VALID'
end
render html: 'DONE'
end
private
def strong_params
# attr_1 and attr_2 are set in the application controller and are available here.
params.require(:model).permit(:name, :attribute_1, :attribute_2).merge(attribute_1: @attr_1, attribute_2: @attr_2)
# Inserting the following two lines causes a ForbiddenAttributesError
puts params.inspect # DOES NOT INCLUDE @attr_1 and/or @attr_2
return params
end
Возможно, я делаю что-то не так, потому что я даже пытался поместить сильные параметры в модель с атрибутами (которые я могу проверить непосредственно перед этим), и это все равно не удается, потому что проверка attr_1 и attr_2 не выполняется в модели.
def create
puts @user.inspect (not nil)
@model = Model.new(name: strong_params[:name], attribute_1: @attr_1, attribute_2: @attr_2)
ОБНОВИТЬ:
Хорошо, я получаю странные ошибки при устранении неполадок. Кажется, слияние работает неправильно, хотя я уверен, что когда-то так и было.
Первое, что я проверил, это @attr_1 и @attr_2, они определенно устанавливаются.
В целях устранения неполадок я сократил приложение before_action до этого:
def application_before_action
@attr_1 = Model.first
@attr_2 = Model.last
С приведенным выше кодом, проверяя объект params, а затем возвращая его после require().permit(), я получаю ForbiddenAttributesError (без указания на что). Если я удалю эти строки, я получу сообщение об ошибке отсутствующих атрибутов модели, указывающее, что @attr_1 и @attr_2 отсутствуют.
ОБНОВЛЕНИЕ 2
Изменил название вопроса, так как наверное запутался при поиске неисправности. Я думаю, что проблема в том, что слияние присваивает nil... но, как ни странно, ручное назначение, предложенное (первоначально мной), и другой ответ здесь. Ключи атрибутов есть, но им присваивается нуль. Кроме того, заметил, что в моем примере использовалась одна модель, хотя на самом деле есть две модели: Model1 и Model2. Я присваиваю значения из Model1 в Model2.
Вот лучшая демонстрация ошибки:
def create
puts '0:'
puts @model1.inspect
puts '1:'
puts strong_params.inspect
@model2 = Model2.new(strong_params) do |m|
m.user_id = @attr_1
m.account_number = @attr_2
end
puts '3:'
puts @model2.inspect
if @model2.valid?
result = @model2.save
render html: 'SUCCESS' and return
else
render html: @model2.errors.full_messages and return
end
end
Выводы в консоли:
0:
#<Model1 id: 29, attribute_1: 'test_value_1', attribute_2: 'test_value_2', created_at: "2018-08-15 03:55:08", updated_at: "2018-08-15 04:05:01">
1:
<ActionController::Parameters {"name"=>"test_name", "attribute_1"=>nil, "attribute_2"=>nil} permitted: true>
3:
#<Model2 id: nil, name: 'test_name', attribute_1: nil, attribute_2: nil, created_at: nil, updated_at: nil>
Очевидно, что нулевой идентификатор и метки времени связаны с тем, что модель еще не сохранена.
HTML model2.errors.full_messages: ["attribute_1 не может быть пустым", "attribute_2 не может быть пустым"]
РЕШЕНИЕ
Раньше, когда я работал в чисто рубиновой среде, я ошибался насчет методов доступа ActiveRecord по умолчанию для моделей. Удаление аксессоров, похоже, решило проблему.
@attr_1
и@attr_2
? Где:application_controller_action
защита? - person chumakoff   schedule 14.08.2018strong_params
— это обычный метод. Он не будет выполнен, пока вы не вызоветеstrong_params
в своем коде. Я думаю, проблема в том, чтоapplication_controller_action
никогда не выполнялся (или не устанавливал@attr_1
и@attr_2
). Вы обдумывали это? - person MrShemek   schedule 14.08.2018name
в контроллере, но как вы получаете@attr_1
и@attr_2
. Являются ли они также частью запроса? - person MrShemek   schedule 14.08.2018@attr_1
и@attr_2
определенно устанавливаются. Однако это не означает, что они не могут бытьnil
. ДажеModel.first
иModel.last
могут возвращатьnil
, если записей нет. Вы проверили значения@attr_1
и@attr_2
перед назначением? - person 3limin4t0r   schedule 15.08.2018