2016-04-26 12 views
3

リフォームの宝石を使用して、私のウェブストアでチェックアウト用のフォームオブジェクトを作成しています。私はアドレスモデルとの関連性を持つOrderモデルのプロパティを含むCheckoutフォームを持っています。リフォームの宝石:複数のフォームに1つのモデルを使用する

問題は、注文のモデルが同じアドレスモデルを持つ2つの関連性を持っている:

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

だから私は二回アドレスモデルを使用するために、私のチェックアウトのフォームを設定する必要があります。私が適用した一時的なアプローチは簡単でした。しかし、うまくいきました:

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 

しかし、重複したコードをリファクタリングする必要があることは明らかです。そしてそこに私は実際の解決策を考え出すことができないことが分かりました。だから、仕事上のものを作るための改革のいずれかの標準的なアプローチがある

@checkout = Checkout.new(@order) 

は私にエラー

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

を与えていた

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 

そして、そのセットアップを:私の最後の試みは、以下のようなものでした?それとも誰かが私が間違っていることを教えてくれる?ありがとう!

+0

誤って私は答えを見つけました。実際の問題は私のモジュール名だったAddress私のモデルの名前の正確な名前。だから明らかに紛争を起こしました。 – VAD

答えて

2

私は誤って答えを見つけました。実際の問題は私のモジュール名だったAddress私のモデルの名前の正確な名前。明らかに紛争を起こしました。そこでAddressを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 
関連する問題