强参数不接受数组

我在我的视图中有这个多选复选框

模型

class User  :destroy accepts_nested_attributes_for :user_roles, :allow_destroy => true has_many :roles, :through => :user_roles end 

视图

  

这个强大的参数写成

  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"=>"a@loclahost.com", "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 

任何线索为什么它不接受来自forms的role_ids数组?

请参阅有关嵌套属性的Rails 强参数文档 。

正确的格式是:

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

AnkitG的解决方案在Rails 4中使用Role Model gem为我的用户模型工作。 我的用户控制器的_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 

这应该工作

 params.require(:user).permit(:first_name, :role_ids => []) 

回答我自己,我没有直接工作,但强参数问题讨论中的以下方法帮助我将正常参数转换为白名单参数。

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