Подтвердить что ты не робот

Как использовать Rails 4 сильных параметра с has_many: через объединение?

У меня возникли проблемы с получением has_many: через объединение, работающее с сильными параметрами Rails 4. У меня есть модель под названием Checkout, и мне нужно выбрать человека из модели Employee в новой форме оформления. Checkouts и Employees связаны с помощью модели Employment.

Я получаю эту ошибку, когда пытаюсь создать новую проверку:

NoMethodError in CheckoutsController#create
undefined method `employee' for #<Checkout:0x007ff4f8d07f88>

Кажется, что что-то не так с моим действием на создание, с моими параметрами проверки или с моей новой формой выписки. Здесь создайте действие:

  def create    
    @user = current_user
    @checkout = @user.checkouts.build(checkout_params)

    respond_to do |format|
      if @checkout.save
        format.html { redirect_to @checkout, notice: 'Checkout was successfully created.' }
      else
        format.html { render action: 'new' }
      end
    end
  end

Мои параметры проверки:

def checkout_params
      params.require(:checkout).permit(:job, :employee_ids, :shift, :date, :hours, :sales, :tips, :owed, :collected, :notes)
end

Моя новая форма оформления заказа:

<div class="field">
     <%= f.label :employee %><br>
     <%= f.collection_select(:employee_ids, Employee.all.collect, :id, :full_name, {:prompt => "Please select"} ) %>
</div>

Но я не могу понять, что изменилось с Rails 4 и сильными параметрами. В Rails 3 этот тип ассоциации и формы работал у меня, используя attr_accessible вместо strong_parameters.

Релевантные файлы

Полная ошибка ошибки: https://gist.github.com/leemcalilly/0cb9e2b539f9e1925a3d

модели/checkout.rb: https://gist.github.com/leemcalilly/012d6eae6b207beb147a

Контроллеры/checkouts_controller.rb: https://gist.github.com/leemcalilly/a47466504b7783b31773

мнение/извлечения/_form.html.erb https://gist.github.com/leemcalilly/ce0b4049b23e3d431f55

модели/employee.rb: https://gist.github.com/leemcalilly/46150bee3e6216fa29d1

Контроллеры/employees_controller.rb: https://gist.github.com/leemcalilly/04f3acdac0c9a678bca8

модели/employment.rb: https://gist.github.com/leemcalilly/6adad966dd48cb9d1b39

дб/schema.rb: https://gist.github.com/leemcalilly/36be318c677bad75b211

4b9b3361

Ответ 1

Имейте в виду, что имя, которое вы даете своим сильным параметрам (сотрудникам, сотрудникам и т.д.), в значительной степени не имеет значения, поскольку оно зависит от имени, которое вы хотите отправить. Сильные параметры не работают "магия", основанная на соглашениях об именах.

Причина https://gist.github.com/leemcalilly/a71981da605187d46d96 заключается в том, что ошибка "Непредвиденный параметр" на "employee_ids" связана с тем, что он ожидает массив скалярного значения, за https://github.com/rails/strong_parameters#nested-parameters, а не только скалярное значение.

# If instead of:
... "employee_ids" => "1" ...
# You had:
... "employee_ids" => ["1"]

Тогда ваши сильные параметры будут работать, в частности:

... { :employee_ids => [] } ...

Потому что он получает массив скалярных значений вместо просто скалярного значения.

Ответ 2

Хорошо, поэтому мне не нужно было вставлять параметры. Это то, что в конечном итоге работает для меня:

# Never trust parameters from the scary internet, only allow the white list through.
def checkout_params
  params.require(:checkout).permit(:job, :shift, :employee_ids, :date, :hours, :sales, :tips, :owed, :collected, :notes)
end

Вот комбинация изменений, которые сработали.

Все еще не совсем понятно, почему это сработало.

Ответ 3

Я могу опубликовать выражение разрешения, которое я использую в одном из моих контроллеров. У этого есть много и много ассоциация, также. Вы вставляете массив разрешений. Используйте ассоциацию поиска в инструкции разрешения. Единственное различие должно быть в том, что ваш не будет вложен в третий раз.

В моем случае ассоциация котировка has_many :quote_items.

QuoteItems has_many :quote_options, :through => quote_item_quote_options.

В quotes_controller.rb

params.require(:quote).permit(:quote_date, :good_through, :quote_number, quote_items_attributes: [:id,:quote_id, :item_name, :material_id, quote_item_quote_options_attributes:[:quote_option_id,:quote_item_id,:qty,:_destroy,:id]])