Проблема создания или обновления в Ruby / Datamapper - постоянная ошибка - PullRequest
0 голосов
/ 28 марта 2011

У меня есть класс пользователя, который может иметь адрес для выставления счета. Когда я публикую форму оплаты, предполагая, что пользователь указал, что хочет сохранить данные своего платежного адреса, я хочу либо создать новую запись адреса, либо обновить исходную.

Я перепробовал много вещей, но ближе всего я могу найти рабочий код ...

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

Любая помощь высоко ценится

1 Ответ

0 голосов
/ 28 марта 2011

Вы объединяете множество вещей вместе. Как насчет:

billing = BillingAddress.first_or_new(:user => user, @addr) #don't update, send the hash as second parameter
billing.saved? ? billing.update(@addr) : billing.save
raise "Billing is not saved for some reason: #{billing.errors.inspect}" unless billing && billing.saved?
user.billing_address = billing
user.save
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...