12

我认为这是一个多选复选框

模型

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"=>"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

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

4

3 回答 3

21

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

正确的格式是:

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

AnkitG 的解决方案在 Rails 4 中为我工作,为我的用户模型使用角色模型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

于 2013-07-29T18:53:52.267 回答
8

这应该工作

params.require(:user).permit(:first_name, :role_ids => [])
于 2013-07-26T10:49:41.590 回答
7

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

def user_params
  params.require(:user).permit(:first_name).tap do |whitelisted|
    whitelisted[:role_ids] = params[:user][:role_ids]
  end
end
于 2013-07-26T11:35:55.723 回答