сильные параметры, не принимающие массив

У меня есть это, на мой взгляд, это флажок с множественным выбором

Модель

class User < ActiveRecord::Base
  has_many :user_roles, :dependent => :destroy
  accepts_nested_attributes_for :user_roles, :allow_destroy => true
  has_many :roles, :through => :user_roles
end

просмотреть

<%= check_box_tag 'user[role_ids][]', role.id, user.blank? ? nil : user.roles.include?(role) ,id: dom_id(role)%>

сильные параметры для этого записываются как

  def user
    params.require(:user).permit(:first_name,{:role_ids => []})
  end

Но при создании пишет

Processing by Admin::UsersController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"+y8iWya5KIILqS0embEUEZuClycXq0O9Q4pA+MnbM0g=", "user"=>{"first_name"=>"", "last_name"=>"", "email"=>"[email protected]", "language"=>"en", "access_level_id"=>"1", "role_ids"=>["", "1", "", "5", "", "", ""], "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Create user"}

Unpermitted parameters: role_ids
Unpermitted parameters: role_ids
Unpermitted parameters: role_ids
Unpermitted parameters: role_ids

Любая подсказка, почему он не принимает массив role_ids, который исходит из формы?


person AnkitG    schedule 26.07.2013    source источник


Ответы (3)


См. документацию Rails по Strong Parameters относительно вложенных атрибутов.

Правильный формат:

params.permit(:name, {:roles => []}, ...)

решение AnkitG работало у меня в Rails 4 с использованием Role Model для моей пользовательской модели. Реализация _params моего пользовательского контроллера в итоге выглядела так:

def user_params
  # Bug with permit for nested arrays... @see https://stackoverflow.com/a/17880288/2631472
  params.require(:user).permit(:first_name, :last_name, :middle_name).tap do |whitelisted|
    whitelisted[:roles] = params[:user][:roles]
  end
end

person rypit    schedule 29.07.2013
comment
Работал на меня. Спасибо! - person Stanislav Pankevich; 08.08.2014

Это должно работать

params.require(:user).permit(:first_name, :role_ids => [])
person Benj    schedule 26.07.2013
comment
вставьте свой метод создания, пожалуйста - person Benj; 26.07.2013
comment
создал GIST здесь . Пожалуйста, посмотрите - person AnkitG; 26.07.2013
comment
Вы можете опубликовать сообщение об ошибке, когда вы делаете это таким образом? Я попробовал это в консоли, и он работает правильно (используя параметры в вашем вопросе) - person Slicedpan; 26.07.2013
comment
@BenjaminSinclaire спасибо за этот ответ .. у меня это сработало :) - person Abhiram; 06.09.2013
comment
Как указать role_ids в качестве отдельного ключа? - person quantumpotato; 18.03.2014

Отвечая себе, я заработал не напрямую, а с помощью приведенного ниже метода из обсуждения проблем с сильными параметрами помог мне преобразовать обычный параметр в белый список.

def user_params
  params.require(:user).permit(:first_name).tap do |whitelisted|
    whitelisted[:role_ids] = params[:user][:role_ids]
  end
end
person AnkitG    schedule 26.07.2013