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 
+0

感谢您的响应,但不知道这是如何解决更新方案?如果帐单记录已存在,则不会被新值覆盖。 – 2011-03-28 10:46:57

+0

好的 - 调整为在同一路线上更新。然而,现在看起来有点冗长。 – stef 2011-03-28 11:01:29

+0

感谢您的想法。这让我尝试了更多的想法。我相信它不可变的原因是因为我从用户类和直接从帐单类引用相同的对象。因为我很早就对用户类进行了修改,所以它有效地阻止了我通过其他路由修改同一个对象 - 账单地址类。仍然感到惊讶的是,在Ruby中没有一个整洁的内胆可以做到这一点! – 2011-03-29 14:17:02