在Rails中使用accepts_nested_attributes_for +质量分配保护

时间:2009-08-14 01:22:32

标签: ruby-on-rails ruby nested-forms mass-assignment

假设您有这种结构:

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。

  1. user_ids直接填充到params哈希(它们非常嵌套)
    • 保存将失败,因为user_ids不可批量分配
  2. #save完成后为每个电视填充用户
    • 保存将失败,因为user_id必须存在
    • 即使我们绕过上述情况,电视也会暂时没有ids - 糟透了。
  3. 有什么好办法吗?

1 个答案:

答案 0 :(得分:2)

这有什么不对吗?

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

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