У меня есть класс пользователя, который может иметь адрес для выставления счета. Когда я публикую форму оплаты, предполагая, что пользователь указал, что хочет сохранить данные своего платежного адреса, я хочу либо создать новую запись адреса, либо обновить исходную.
Я перепробовал много вещей, но ближе всего я могу найти рабочий код ...
class User
include DataMapper::Resource
property :id, Serial
property :provider, String, :length => 100
property :identifier, String, :length => 100
property :username, String, :length => 100
property :remember_billing, Boolean
has 1, :billing_address
end
class BillingAddress
include DataMapper::Resource
property :first, String, :length => 20
property :surname, String, :length => 20
property :address1, String, :length => 50
property :address2, String, :length => 50
property :towncity, String, :length => 40
property :state, String, :length => 2
property :postcode, String, :length => 20
property :country, String, :length => 2
property :deleted_at, ParanoidDateTime
belongs_to :user, :key => true
end
post "/pay" do
@post = params[:post]
@addr = params[:addr]
if @addr == nil
@addr = Hash.new
end
user = User.first(:identifier => session["vya.user"])
user.remember_billing = !!@post["remember"]
if user.remember_billing
user.billing_address = BillingAddress.first_or_create({ :user => user }, @addr)
end
user.save
...
, который отлично работает, когда нет записи. Но если запись уже существует, она сохраняет исходные значения.
я видел похожий пост
DataMapper: создание новой записи или обновление существующей
но если я изменю код на
user.billing_address = BillingAddress.first_or_create(:user => user).update(@addr)
Я получаю ошибку
DataMapper::ImmutableError at /pay
Immutable resource cannot be modified
Любая помощь высоко ценится