【问题标题】:associated fields not loading values from database关联字段未从数据库加载值
【发布时间】:2016-08-15 09:05:13
【问题描述】:

我正在尝试获取一个嵌套属性表单来检测已经加载到数据库中的值,任何人都可以看到这段代码有什么问题

控制器

def edit
    @merchant = Merchant.find(params[:id])
    @states = State.form_selector
    @merchant.build_address if @merchant.address1.nil?
    @merchant.build_account if @merchant.bsb.nil?
    @products = Product.all
  end

查看

= form.fields_for :address do |address_fields|
    = address_fields.hidden_field :address_type_id, value: 4
    = address_fields.hidden_field :default, value: true
    .mdl-textfield.mdl-js-textfield.mdl-textfield--floating-label.mdl-cell.mdl-cell--12-col
      = address_fields.text_field :address1, class: 'mdl-textfield__input'
      = address_fields.label :address1, class: 'mdl-textfield__label'
    .mdl-textfield.mdl-js-textfield.mdl-textfield--floating-label.mdl-cell.mdl-cell--12-col
      = address_fields.text_field :address2, class: 'mdl-textfield__input'
      = address_fields.label :address2, class: 'mdl-textfield__label'
    .mdl-textfield.mdl-js-textfield.mdl-textfield--floating-label.mdl-cell.mdl-cell--6-col
      = address_fields.text_field :city, class: 'mdl-textfield__input'
      = address_fields.label :city, class: 'mdl-textfield__label'
    .mdl-textfield.mdl-js-textfield.mdl-textfield--floating-label.mdl-cell.mdl-cell--2-col
      = address_fields.text_field :zip_code, class: 'mdl-textfield__input', :pattern => '^(0[289][0-9]{2})|([1345689][0-9]{3})|(2[0-8][0-9]{2})|(290[0-9])|(291[0-4])|(7[0-4][0-9]{2})|(7[8-9][0-9]{2})$'
      = address_fields.label :zip_code, class: 'mdl-textfield__label'
      %span.mdl-textfield__error= t('.postcode_error')
    .mdl-textfield.mdl-js-textfield.mdl-textfield--floating-label.mdl-cell.mdl-cell--3-col
      = address_fields.select   :state_id, @states, :include_blank => true
      = address_fields.label :state_id, class: 'mdl-textfield__label'

【问题讨论】:

  • 您的 Merchant 模型中有 accepts_nested_attributes_for :address 吗?
  • 是的,数据被提交到数据库,但是当你去编辑那个元素时,它就像什么都没有被保存过
  • 但是它叫address1还是address?我猜你把他们弄糊涂了:@merchant.build_address if @merchant.address1.nil?
  • 字段为address1,模型为address

标签: ruby-on-rails associations nested-forms nested-attributes


【解决方案1】:

@merchant.address 返回一个集合,即使为 null 它也返回一个数组。

@merchant.address # []   
@merchant.address.nil?   # false
@merchant.address.blank? # true

def edit
  @merchant = Merchant.find(params[:id])
  @states = State.form_selecto
  @merchant.build_address if @merchant.address.blank?
  @merchant.build_account if @merchant.bsb.blank?
  @products = Product.all
end

但我更喜欢在视图中使用这种方式。因为这样你删除了很多你的控制器动作的代码#edit #new #update #create

view
- form.object.build_address if form.object.blank?
= form.fields_for :address do |address_fields|
    = address_fields.hidden_field :address_type_id, value: 4

【讨论】:

  • 使用 .blank 仍然可以得到相同的结果
  • 这是accepts_nested_attributes_for :address, reject_if: proc { |attributes| attributes['address1'].blank? }模型中的内容
  • 我想查看 has_many 关联。如果您在您的 Rails 控制台中输入 Merchant.find(1).address,返回的是什么?
  • 我想确定您的问题是在模型、控制器还是视图中
  • Merchant.find(45).address Merchant Load (2.7ms) SELECT "merchants".* FROM "merchants" WHERE "merchants"."id" = $1 LIMIT 1 [["id", 45]] Address Load (2.0ms) SELECT "addresses".* FROM "addresses" WHERE "addresses"."addressable_id" = $1 AND "addresses"."addressable_type" = $2 LIMIT 1 [["addressable_id", 45], ["addressable_type", "Merchant"]] => #<Address:0x007ffa04a4ba18 id: 4, address_type_id: 4, first_name: "Paul", last_name: "McGuane", addressable_type: "Merchant", addressable_id: 45, address1: "123 Fake", address2: "", city: "Test",
猜你喜欢
  • 2011-01-26
  • 2017-08-27
  • 2012-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 2015-07-16
相关资源
最近更新 更多