在 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
在 rake 任务中使用 rails logger,rails 5