如何设计具有两个,独立和可选关系的模型到同一模型?

时间:2011-09-29 12:38:15

标签: ruby-on-rails ruby-on-rails-3 rails-activerecord nested-forms

我在设计User模型并为其制作一个体面的形式时遇到了问题。我只是想确保自己做错了:) 所以它是这样的:

User有两个Address es:

  • 用于识别和结算的强制性Address
  • 他可以填写或留空的可选送货Address

我试过这样:

class User < ActiveRecord::Base
  has_one :address
  has_one :shipping_address, :class_name => 'Address', :foreign_key => 'shipping_address_id'
  accepts_nested_attributes_for :address
  accepts_nested_attributes_for :shipping_address
  #validations for user
end

class Address < ActiveRecord::Base
  #validations for address
end

然后我使用User和嵌套form_forfields_for制作表单。像这样:

= form_for @user, :url => '...' do |a|
  = f.error_messages
  ...
    = fields_for :address, @user.build_address do |a|
      ...

但是,尽管f.error_messages为所有模型生成了错误,但Address的字段在错误时不会突出显示。

当用户选择不填写第二个地址时,我也遇到了禁用第二个地址验证的问题。

我怀疑我的方法是否正确。我的意思是这个装置的has_one关系和整体设计。

所以问题是:

我做错了吗?你怎么会在我的位置做到这一点?

1 个答案:

答案 0 :(得分:1)

表单中的错误是每次呈现视图时都会构建一个新地址,从而丢失所有验证错误。

在您的控制器中,在new操作中,您应该执行类似

的操作
@user.build_address

并在您的视图中写道:

= fields_for :address, @user.address do |a|

希望这有帮助。