6

假设你有这个结构:

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必须存在
    • 即使我们绕过上述内容,电视也会有一段时间没有 id - 糟透了

有什么体面的方法可以做到这一点吗?

4

1 回答 1

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

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

于 2009-08-14T02:19:45.880 回答