リフォームの宝石を使用して、私のウェブストアでチェックアウト用のフォームオブジェクトを作成しています。私はアドレスモデルとの関連性を持つ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
そして、そのセットアップを:私の最後の試みは、以下のようなものでした?それとも誰かが私が間違っていることを教えてくれる?ありがとう!
誤って私は答えを見つけました。実際の問題は私のモジュール名だったAddress私のモデルの名前の正確な名前。だから明らかに紛争を起こしました。 – VAD