2013-07-26 7 views
12

ich dies in meiner Ansicht haben, die eine Mehrfachauswahl Checkboxstarke Parameter nicht Array akzeptieren

Modell ist

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 

Ansicht

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

die starken Parameter dafür ist, geschrieben als

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

Aber schaffen es sagt

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 

Jede Ahnung, warum es nicht das Array von role_ids zu akzeptieren, die von der Form kommt?

Antwort

7

Answering mich arbeiten sollte, habe ich es nicht direkt zu arbeiten, aber die folgenden Verfahren aus dem Strong Parameters issues discussion hat mir geholfen, einen normalen Parameter auf einen weißen Liste eine in konvertieren.

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

Diese

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

gut habe ich versucht, auf diese Weise zu .. es hat nicht funktioniert .. – AnkitG

+0

fügen Sie Ihre create-Methode pls – Benj

+0

ein GIST erstellt [hier] (https://gist.github.com/ankit8898/6088035). Bitte werfen Sie einen Blick – AnkitG

21

Siehe Schienen Strong Parameters documentation regarding nested attributes.

Das richtige Format ist:

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

AnkitG's solution für mich in Rails arbeitete 4 das Role Model Juwel für mein Benutzermodell. Meine User-Controller-Implementierung von _params beendet aussehen wie:

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 

+0

Arbeitete für mich. Vielen Dank! –

Verwandte Themen