【问题标题】:copying old object attributes ruby on rails在rails上复制旧对象属性ruby
【发布时间】:2012-10-02 01:01:06
【问题描述】:

您想复制旧对象的一些属性并创建具有很少更改属性的新对象。我使用的是 rails 3.0.7 版,因此我无法使用 old_object.dup。我不想使用 old_object.clone 因为它给了我记录的浅表副本,包括复制冻结状态。因此我遵循以下方法

@old_product = Product.find(params[:id])

@product = Product.create(@old_product.attributes.merge({:description => params[:product][:description], :category => params[:product][:box_id], :user_id => current_user.id}))

但它给了我错误用户不能为空。事实上,它也没有存储我的描述和类别。这是正确的方法吗?复制旧对象的属性并更改其中一些属性的任何其他方法。

【问题讨论】:

  • 我可以更改类别属性和描述,但无法更改 user_id。即使它没有从 old_product 对象复制 user_id 属性。它显示零值....
  • user_id 字段是否是 Product 模型中的白名单属性,因此您可以批量分配它?
  • Hye Agis 我刚刚回答了我的问题,你说得对,我将它添加到可访问的属性列表中,现在它正在工作,谢谢你的快速回复......
  • 从 rails 2.0.0 开始支持 dup 方法。见apidock.com/rails/ActiveResource/Base/dup

标签: ruby-on-rails object activerecord clone


【解决方案1】:

我知道了...在产品模型中 :user_id 现在已添加到 atr_accessible 中。最初我无法访问该属性,因此它不会更新或更改 new_object 中的该属性。 现在它工作正常。

【讨论】:

【解决方案2】:

你最好不要设置attr_accessible :user_id。这将是您系统中的一个漏洞,任何人都可以通过批量分配来更改值。而是在此代码中手动分配它或使用一些克隆功能并更改其他属性。

【讨论】:

    【解决方案3】:

    一个混乱的解决方案是将attr_accessible :user_id 添加到您的模型中,但不建议这样做,因为它会使您的应用程序容易受到 Mass Assignment 攻击。

    如果你打算在开发中使用它一段时间也没关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      相关资源
      最近更新 更多