2016-04-26 98 views
3

我正在使用改革创业板在我的网上商店做结帐的表单对象。我有Checkout表单,其中包含Order模型的属性,它与Address模型有关联。改革创业板:使用多种形式的一种模式

问题是订单模型具有相同的地址模型中的两个联想:

class Order < ActiveRecord::Base 
    #... 
    belongs_to :billing_address, :class_name => 'Address' 
    belongs_to :shipping_address, :class_name => 'Address' 
    #... 
end 

所以我需要建立自己的Google Checkout形式使用的地址模式的两倍。我曾经申请的临时方法很简单。但它工作正常:

class Checkout < Reform::Form 
    extend ::ActiveModel::Callbacks 
    #... 
    property :billing_address, populate_if_empty: Address do 
    property :firstname 
    property :lastname 
    property :address1 
    property :address2 
    property :phone 
    property :city 
    property :zipcode 
    property :country_id 
    property :billing_address_for_id 
    property :shipping_address_for_id 

    validates :firstname, 
       :lastname, 
       :address1, 
       :phone, 
       :city, 
       :zipcode, 
       :country_id, 
       presence: true 

    # provided by phony_rails gem 
    # validates phone number to be correct and plausible 
    # without country accordance 
    validates :phone, phony_plausible: { ignore_record_country_code: true } 

    # provided by validates_zipcode gem 
    # validates zipcode to be correct due to country alpha2 code 
    validates :zipcode, zipcode: { country_code: :country_code } 
    end 

    property :shipping_address, populate_if_empty: Address do 
    property :firstname 
    property :lastname 
    property :address1 
    property :address2 
    property :phone 
    property :city 
    property :zipcode 
    property :country_id 
    property :billing_address_for_id 
    property :shipping_address_for_id 

    validates :firstname, 
       :lastname, 
       :address1, 
       :phone, 
       :city, 
       :zipcode, 
       :country_id, 
       presence: true 

    # provided by phony_rails gem 
    # validates phone number to be correct and plausible 
    # without country accordance 
    validates :phone, phony_plausible: { ignore_record_country_code: true } 

    # provided by validates_zipcode gem 
    # validates zipcode to be correct due to country alpha2 code 
    validates :zipcode, zipcode: { country_code: :country_code } 
    #... 
    end 

但很明显,重复的代码必须重构。在那里,我发现我不能提出任何工作解决方案。我最后的尝试是像以下:

class Checkout < Reform::Form 
    extend ::ActiveModel::Callbacks 
    #... 
    property :billing_address, populate_if_empty: Address, form: BillingAddress 
    property :shipping_address, populate_if_empty: Address, form: ShippingAddress 
    #... 
end 

class BillingAddress < Reform::Form 
    extend ::ActiveModel::Callbacks 
    include Address 
end 

class ShippingAddress < Reform::Form 
    extend ::ActiveModel::Callbacks 
    include Address 
end 

module Address 
    include Reform::Form::Module 

    property :firstname 
    property :lastname 
    property :address1 
    property :address2 
    property :phone 
    property :city 
    property :zipcode 
    property :country_id 
    property :billing_address_for_id 
    property :shipping_address_for_id 

    validates :firstname, 
      :lastname, 
      :address1, 
      :phone, 
      :city, 
      :zipcode, 
      :country_id, 
      presence: true 

    # provided by phony_rails gem 
    # validates phone number to be correct and plausible 
    # without country accordance 
    validates :phone, phony_plausible: { ignore_record_country_code: true } 

    # provided by validates_zipcode gem 
    # validates zipcode to be correct due to country alpha2 code 
    validates :zipcode, zipcode: { country_code: :country_code } 
end 

有了这样的设置

@checkout = Checkout.new(@order) 

是给我的错误

undefined method `active_record' for #Declarative::Heritage:0x007ff6ea6fb038 

那么,有在改革的任何标准的方法来使事情上述工作?或者有人可以告诉我做错了什么?谢谢!

+0

一不留神,我找到了答案。实际的问题是我的模块名称是地址什么是我的一个模型的确切名称。所以它明显地造成了一些冲突。 – VAD

回答

2

我意外地找到了答案。实际的问题是我的模块名称是地址什么是我的一个模型的确切名称。这显然有些冲突。所以我将地址更改为AddressModule。

而我的工作设置为:

class Checkout < Reform::Form 
    extend ::ActiveModel::Callbacks 
    #... 
    property :billing_address, populate_if_empty: Address, form: BillingAddress 
    property :shipping_address, populate_if_empty: Address, form: ShippingAddress 
    #... 
end 

class BillingAddress < Reform::Form 
    extend ::ActiveModel::Callbacks 
    include AddressModule 
end 

class ShippingAddress < Reform::Form 
    extend ::ActiveModel::Callbacks 
    include AddressModule 
end 

module AddressModule 
    include Reform::Form::Module 

    property :firstname 
    property :lastname 
    property :address1 
    property :address2 
    property :phone 
    property :city 
    property :zipcode 
    property :country_id 
    property :billing_address_for_id 
    property :shipping_address_for_id 

    validates :firstname, 
      :lastname, 
      :address1, 
      :phone, 
      :city, 
      :zipcode, 
      :country_id, 
      presence: true 

    # provided by phony_rails gem 
    # validates phone number to be correct and plausible 
    # without country accordance 
    validates :phone, phony_plausible: { ignore_record_country_code: true } 

    # provided by validates_zipcode gem 
    # validates zipcode to be correct due to country alpha2 code 
    validates :zipcode, zipcode: { country_code: :country_code } 
end