ruby-on-rails - multiple - rails permit param
parámetros fuertes que no aceptan array (3)
Esto debería funcionar
params.require(:user).permit(:first_name, :role_ids => [])
Tengo esto en mi opinión, que es una casilla de verificación de selección múltiple
Modelo
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
ver
<%= check_box_tag ''user[role_ids][]'', role.id, user.blank? ? nil : user.roles.include?(role) ,id: dom_id(role)%>
los parámetros fuertes para esto se escriben como
def user
params.require(:user).permit(:first_name,{:role_ids => []})
end
Pero en crear dice
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
¿Alguna pista de por qué no acepta la matriz de role_ids que proviene de la forma?
Respondiendo a mí mismo, lo conseguí trabajando no directamente, pero el siguiente método de la discusión de problemas de Strong Parameters me ayudó a convertir un parámetro normal en uno de la lista blanca.
def user_params
params.require(:user).permit(:first_name).tap do |whitelisted|
whitelisted[:role_ids] = params[:user][:role_ids]
end
end
Consulte la documentación de Rails Strong Parameters sobre los atributos anidados .
El formato correcto es:
params.permit(:name, {:roles => []}, ...)
La solución de AnkitG funcionó para mí en Rails 4 usando la gema de Role Model para mi modelo de usuario. La implementación de _params de mi controlador de usuario terminó pareciéndose a:
def user_params
# Bug with permit for nested arrays... @see https://.com/a/17880288/2631472
params.require(:user).permit(:first_name, :last_name, :middle_name).tap do |whitelisted|
whitelisted[:roles] = params[:user][:roles]
end
end