Недопустимые параметры для ассоциации принадлежащих к - PullRequest
0 голосов
/ 16 октября 2018

У меня есть связь следующим образом:

class Membership < ApplicationRecord
   belongs_to :user
end

и

class User < ApplicationRecord
   has_many :memberships
end

Теперь у меня есть форма для создания нового членства.В этой форме я также хочу ввести новую информацию о пользователе.Я использую SimpleForm.Моя основная структура выглядит следующим образом (с использованием файлов HAML, а не файлов erb):

= simple_form_for @membership  do |f|
...
   = simple_fields_for @user do |uf|
      .field= uf.input :firstname, label: 'First Name', required: true
...
= f.button :submit, 'Submit'

@user здесь - переменная экземпляра, установленная в новом действии на контроллере Memberships (@user = User.new).Я хотел бы сохранить его таким образом, чтобы я мог использовать логический вывод SimpleForm для пользовательских атрибутов (то есть uf.input :firstname сопоставляется с атрибутом firstname в модели User) Теперь, когда я нажимаю на кнопку отправки, цель состоит в том, чтобысоздать новое членство и новый пользователь, связанный с этим членством.Как я могу разрешить параметры для одного ассоциированного пользователя?

На данный момент у меня есть:

# Never trust parameters from the scary internet, only allow the white list through.
def membership_params
   params.require(:membership).permit(users_attributes: [:id, :firstname] )
end

Вот запрос:

Started POST "/memberships" for ::1 at 2018-10-15 15:08:42 -0600
Processing by MembershipsController#create as HTML
   Parameters: {"utf8"=>"✓", "authenticity_token"=>"omitted==", "membership"=>{"user"=>{"firstname"=>""}}, "commit"=>"Submit"}
Unpermitted parameter: :user
Unpermitted parameter: :user
Unpermitted parameter: :user
##################### {}
No template found for MembershipsController#create, rendering head :no_content
Completed 204 No Content in 264ms (ActiveRecord: 0.0ms)

У меня нет шаблонаРендеринг специально для этого.

Учитывая эту структуру параметров:

"membership"=>{"user"=>{"firstname"=>""}}

Я также попробовал следующее для разрешенных параметров:

params.require(:membership).permit(user_attributes: [:id, :firstname] )
params.require(:membership).permit(user: [:id, :firstname] )

Обратите внимание, что ################ {}.Это руководство помещает меня в действие создания.puts '################ ' + membership_params.to_json.Как видите, ничего не дает.Кроме того, почему я получаю «Неразрешенные параметры», регистрируемые три раза?

ОБНОВЛЕНИЕ 1 код контроллера:

class MembershipsController < ApplicationController
  load_and_authorize_resource

  # GET
  def new
    @membership_plans = Plan.active.sort_by { |plan| plan.sequence }
    @user = @membership.build_user
  end

  # POST
  def create
    debug_puts(membership_params.to_json)
  end

  private
  # Never trust parameters from the scary internet, only allow the white list through.
  def membership_params
    params.require(:membership).permit(user_attributes: [:id, :firstname, :lastname] )
  end
end

ОБНОВЛЕНИЕ 2

Я не считаю это приемлемым ответом (именно поэтому я формально не "отвечаю" на мой вопрос), но я решил инвертировать свою форму.Отношения по-прежнему одинаковы для Членств и Пользователей, но родительская форма предназначена для Пользователя:

= simple_form_for @user do |f|
...
   = f.simple_fields_for :memberships_attributes do |mf|
   ...

Это означает, что я поставил accepts_nested_attributes_for :membership для модели User (ассоциация has_many с членством) и всерендеринг и разрешение параметров выполняется в контроллере пользователей

# new action in users_controller.rb
def new
   @membership_plans = Plan.active.sort_by { |plan| plan.sequence }
   @user = User.new
   @user.build_membership
end

# Never trust parameters from the scary internet, only allow the white list through.
def user_params
   params.require(:user).permit(memberships_attributes: [:id, :field1, :field2] )
end

1 Ответ

0 голосов
/ 16 октября 2018

Вам нужно построить user для membership в действии new memberships_controller.

def new
  @membership = Membership.new
  @user = @membership.build_user
end

и убедиться, что у вас user_attributes нетusers_attributes в membership_params

params.require(:membership).permit(user_attributes: [:id, :firstname] )

Обновление:

Есть еще один важный фрагмент кода, который необходимо исправить.

Это

= simple_fields_for @user do |uf|

должно быть

= f.simple_fields_for @user do |uf|
...