2017-05-03 2 views
0

Je souhaite accéder à usr_additional_users_attributes dans les paramètres suivants? Comment puis je faire ça ?Comment accéder aux attributs imbriqués dans ruby ​​on rails?

params.require(:usr_contact).permit(:first_name, :last_name, :dob, :gender, 
            :mobile, :email, :password, 
            :password_confirmation, 
            :image, 
            usr_contact_vendors_attributes: 
             [:id, usr_vendor_property_attributes: 
              [:shop_name, :specified_area, :mobile, :website, 
              usr_vendor_branches_attributes: 
               [:address_line1, :address_line2, :city ,:zip_code ], 
              usr_additional_users_attributes:[:id,:email,:role, :_destroy]]]) 

fin

Je veux comme ça dans mon contrôleur et mettre des e-mails à un tableau. celui-ci montrant une erreur

params[:usr_contact][:usr_contact_vendors_attributes][:usr_vendor_property_attributes][:usr_additional_users_attributes].values.each do |item| 
     @emailSet << item[:email] 
    end 

méthode non définie [] » pour nil: NilClass

des suggestions?

+0

Je dirais, étape par étape pour vérifier 'params [: usr_contact]', puis 'params [: usr_contact] [: usr_contact_vendors_attributes]', et ainsi de suite. L'un d'eux est «nul». –

Répondre

0

J'ai un exemple de la façon dont je l'ai fait dans mon scénario:

def patient_params 
    params.require(:patient).permit(*permited_patient_attributes) 
    end 

    def permited_patient_attributes 
    [ 
     :user_id, 
     :start, 
     patient_demographic_attributes: [ 
     :id, 
     :patient_id, 
     :start_date, 
     :end_date, 
     :first_name, 
     :middle_name, 
     :last_name, 
     :date_of_birth, 
     :gender, 
     :ethnicity, 
     :marital_status], 
     patient_contact_attributes: [ 
     :id, 
     :patient_id, 
     :street_address, 
     :extended_address, 
     :locality, 
     :region, 
     :postal_code, 
     :country], 
     patient_email_attributes: [ 
     :id, 
     :email], 
     patient_mrn_attributes: [ 
     :id, 
     :patient_id, 
     :mrn], 
     contact_telephones_attributes: [ 
     :id, 
     :party_type, 
     :party_id, 
     :name, 
     :number, 
     :_destroy], 
     patient_physicians_attributes: [ 
     :id, 
     :patient_id, 
     physician_id: []] 
    ] 
    end 

patient_demographic_attributes Ici, patient_contact_attributes. sont imbriqués one.Have un essai

0

Vous devez vous assurer que votre item n'est pas nul avant de le pousser à votre tableau. Le plus simple est de le faire en ajoutant une vérification si item est nul.

@emailSet << item[:email] unless item.nil? 
0

Vous devez utiliser dig parce que quand vous essayez d'accéder à un de ces params, ils sont nuls, si Ruby augmenter cette exception. En utilisant , c'est comme vérifier tous les attributs avant d'y accéder. Il serait bon de vérifier à l'intérieur de l'élément aussi avec item[:email].present?

Votre code ressemblerait à ceci:

params.dig(:usr_contact, :usr_contact_vendors_attributes, :usr_vendor_property_attributes, :usr_additional_users_attributes).values.each do |item| 
    @emailSet << item[:email] if item[:email].present? 
end 
0

Je l'ai fixé par l'impression params. C'était quelque chose comme ça

{"0"=>{"usr_vendor_property_attributes"=>{"shop_name"=>"cbhcvbcvb", "specified_area"=>"cbcvbcb", "website"=>"[email protected]", "mobile"=>"3543243", "usr_vendor_branches_attributes"=>{"1493800739760"=>{"address_line1"=>"", "address_line2"=>"", "city"=>"", "zip_code"=>""}}, "usr_additional_users_attributes"=>{"1493800739774"=>{"email"=>"sdgdfgd", "role"=>"Role1", "_destroy"=>"false"}}}}} permitted: false> 

J'ai manqué cela ["0"], c'était le problème. Ensuite, les paramètres peuvent accéder dans le contrôleur comme ceci.

@test = params[:usr_contact][:usr_contact_vendors_attributes]["0"][:usr_vendor_property_attributes][:usr_additional_users_attributes] 

Merci de nous aider: D