如何在Ruby中访问Ruby的嵌套属性



我想在以下参数中访问usr_additional_users_attributes?我该怎么做?

 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

未定义的方法`[]'

有什么建议?

您必须使用DIG,因为当您尝试访问其中一个参数时,它们是无效的,因此Ruby提出了此例外。通过使用dig,就像在访问它之前先检查所有属性一样。也可以使用item[:email].present?

检查该项目的内部是一件好事

您的代码看起来像:

 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

我有一个示例,说明我在我的情况下如何做:

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

在这里,患者_demographic_attributes,detter_contact_attributes。被嵌套了。尝试

您需要在将其推向数组之前,确保您的item不是零。最简单的方法是添加检查item是否为nil。

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

我通过打印参数修复了它。这是这样的

{"0"=>{"usr_vendor_property_attributes"=>{"shop_name"=>"cbhcvbcvb", "specified_area"=>"cbcvbcb", "website"=>"bcbc@gmail.com", "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>

我想念[" 0"],这就是问题。然后,参数可以像这样访问控制器。

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

感谢您的帮助:D

最新更新