Ruby on rails 在Rails中复制ActiveRecord时,会出现使用现有参数创建新对象的问题

Ruby on rails 在Rails中复制ActiveRecord时,会出现使用现有参数创建新对象的问题,ruby-on-rails,ruby,Ruby On Rails,Ruby,我试图在我的应用程序中复制Rails中的一个资源,但遇到了一些问题 设置是:我有一个用户可以使用的“项目模板”库,然后修改生成的项目。我目前有如下设置: @temp_item = @template_item.dup @new_item = @user.items.create(@temp_item.attributes) 但是,我遇到了一个问题,它试图跨受保护的属性进行复制(即创建的和更新的)。我不想单独列出每个属性,所以我的问题是,有没有办法排除在这个实例中复制的属性? 谢谢。将米沙的好建

我试图在我的应用程序中复制Rails中的一个资源,但遇到了一些问题

设置是:我有一个用户可以使用的“项目模板”库,然后修改生成的项目。我目前有如下设置:

@temp_item = @template_item.dup
@new_item = @user.items.create(@temp_item.attributes)
但是,我遇到了一个问题,它试图跨受保护的属性进行复制(即创建的和更新的)。我不想单独列出每个属性,所以我的问题是,有没有办法排除在这个实例中复制的属性?


谢谢。

将米沙的好建议纳入我的原始答案中

@temp_item_attributes = @template_item.attributes.reject{ |k,v|
  %w(created_at updated_at).include?(k)
}
@new_item = @user.items.create(@temp_item_attributes)

我同意Mark的使用,但在时,我不会使用
case
/
,而是这样做:

@template_item.attributes.reject{ |k,v| %w(created_at updated_at).include?(k) }

在我看来,你应该结合马克·潘恩和米沙的回答,即:

temp_item_attributes = @template_item.attributes.reject do |k,v|
  %w(created_at updated_at).include?(k)
end
@new_item = @user.items.create(temp_item_attributes)

我不敢相信没有一个方便的方法来处理这种行为;我没有仔细看,但没有找到一个。

除了在
创建的
和在
更新的
之外,你可能还必须排除
id
。编辑以合并Misha的建议。太棒了,谢谢Mark。拒绝正是我想要的!如果我没有在拒绝属性列表中包含“id”,则此操作无效<代码>%w(在更新id时创建)。包含?(k)
我只显示了
拒绝部分,因为其余部分很明显,但感谢您的扩展。