2017-05-03 28 views
0

次のパラメータのusr_additional_users_attributesにアクセスしますか?どうやってやるの ?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]]]) 

エンド

私は私のコントローラでこのようにそれを取得し、配列にメールを載せていきたいと思います。これは

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

エラーを示すnilのための未定義のメソッド `[]」:NilClass

任意の提案ですか?

ここ
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、patient_contact_attributes:

+0

私は' paramsはをチェックするために一歩一歩を行く、と言うでしょう。これらのうちの1つは 'nil'です。 –

答えて

0

は、私は私のシナリオでそれをやった方法の例を持っています。入れ子になっています。試してみよう

0

itemが配列にプッシュする前に、必ず0でないことを確認する必要があります。最も簡単な方法は、itemがnilの場合にチェックを追加することです。

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

あなたはこれらのparamsの1にアクセスしようとしているとき、彼らはヌルだからRubyはこの例外を発生させるので、digを使用しなければならないでしょう。 を使用すると、アクセスする前にすべての属性をチェックしているようです。

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

私は印刷のparamsでそれを修正:あなたのコードは次のようになりitem[:email].present?

とあまりにもアイテムの中身をチェックすると良いでしょう。それはこのようなものでした

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

私はそれが問題であったことを逃しています。 このように、paramsはコントローラ内でアクセスできます。助けるため

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

ありがとう:[:usr_contact] `、そして`のparams [:usr_contact]:ように[usr_contact_vendors_attributes] `、およびD

関連する問題