Ruby/Datamapper创建或更新问题 - 不可改变的错误
问题描述:
我有一个用户类,可以选择有一个帐单地址。当我发布付款表格时,假设用户表示他们希望保存其帐单地址详细信息,我想要创建一个新的地址记录或更新原始地址记录。Ruby/Datamapper创建或更新问题 - 不可改变的错误
我已经尝试了很多事情,但我可以向工作代码最接近的是...
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 = [email protected]["remember"]
if user.remember_billing
user.billing_address = BillingAddress.first_or_create({ :user => user }, @addr)
end
user.save
...
时,没有记录工作正常。但是,如果已经有记录,它会保留原始值。
我看到了一个类似的帖子 但如果我改变代码是
user.billing_address = BillingAddress.first_or_create(:user => user).update(@addr)
我得到的错误
DataMapper::ImmutableError at /pay
Immutable resource cannot be modified
任何帮助非常赞赏
答
你链接很多东西在一起,那里。如何:
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
感谢您的响应,但不知道这是如何解决更新方案?如果帐单记录已存在,则不会被新值覆盖。 – 2011-03-28 10:46:57
好的 - 调整为在同一路线上更新。然而,现在看起来有点冗长。 – stef 2011-03-28 11:01:29
感谢您的想法。这让我尝试了更多的想法。我相信它不可变的原因是因为我从用户类和直接从帐单类引用相同的对象。因为我很早就对用户类进行了修改,所以它有效地阻止了我通过其他路由修改同一个对象 - 账单地址类。仍然感到惊讶的是,在Ruby中没有一个整洁的内胆可以做到这一点! – 2011-03-29 14:17:02