在 Rails 中使用 accept_nested_attributes_for + 批量分配保护

Posted

技术标签:

【中文标题】在 Rails 中使用 accept_nested_attributes_for + 批量分配保护【英文标题】:Using accepts_nested_attributes_for + mass assignment protection in Rails 【发布时间】:2010-11-19 12:31:57 【问题描述】:

假设你有这样的结构:

class House < ActiveRecord::Base
  has_many :rooms
  accepts_nested_attributes_for :rooms
  attr_accessible :rooms_attributes
end

class Room < ActiveRecord::Base 
  has_one :tv
  accepts_nested_attributes_for :tv
  attr_accessible :tv_attributes
end

class Tv 
  belongs_to :user
  attr_accessible :manufacturer
  validates_presence_of :user
end

请注意,Tv 的用户不可被故意访问。所以你有一个三重嵌套的表单,允许你在一个页面上输入房子、房间和电视。

这是控制器的创建方法:

def create
  @house = House.new(params[:house])

  if @house.save
    # ... standard stuff
  else
    # ... standard stuff
  end
end

问题:您将如何为每台电视填充 user_id(它应该来自 current_user.id)?有什么好的做法?

这是我在此看到的 catch22。

    user_ids 直接填充到params 哈希中(它们非常嵌套) 保存将失败,因为 user_ids 不可批量分配 #save 完成后为每台电视填充用户 保存将失败,因为user_id 必须存在 即使我们绕过上述方法,电视也会有一段时间没有 id - 糟透了

有什么不错的方法吗?

【问题讨论】:

感谢您的提问。 'attr_accessible :rooms_attributes' 帮助我解决了 Rails 2.3 的 Accept_nested_attributes_for 功能的大规模分配问题。我收到一条错误消息,内容为“警告:无法批量分配这些受保护的属性:XXX_attributes”。 【参考方案1】:

这有什么问题吗?

def create
  @house = House.new(params[:house])
  @house.rooms.map |room| room.tv .each |tv| tv.user = current_user 
  if @house.save
    # ... standard stuff
  else
    # ... standard stuff
  end
end

我还没有尝试过,但现在似乎应该构建和访问对象,即使没有保存。

【讨论】:

你说得对,当我问这个问题时,我不知道我的头在哪里。 这发生在我们所有人身上。很高兴我能帮助你。顺便说一句 - 推特 URL 是个好主意,我必须记得自己做。

以上是关于在 Rails 中使用 accept_nested_attributes_for + 批量分配保护的主要内容,如果未能解决你的问题,请参考以下文章

Rails:在 Rails 视图中使用 javascript 函数的正确语法

如何在 Webpacker 中使用 Rails Url 助手/Rails 5.1 中的 React-rails

在 gem 中使用 rails 作为依赖项

在 rake 任务中使用 rails logger,rails 5

在 JS 模块中使用 Rails-UJS(带有 webpacker 的 Rails 6)

Rails 3:在 Rails 中使用 JSON 响应 REST-ful 操作的正确方法是啥?