代码之家  ›  专栏  ›  技术社区  ›  Max Chernyak

在Rails中使用accepts\u嵌套的\u属性\u进行+质量分配保护

  •  6
  • Max Chernyak  · 技术社区  · 16 年前

    假设你有这样的结构:

    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 对于每个电视(它应该来自当前用户id)?好的做法是什么?

    这是我在这张照片上看到的一个陷阱。

    1. 居住于 user_ids params
      • 保存将失败,因为 用户识别码 质量是不可分配的
    2. 保存完成后为每个电视填充用户
      • 保存将失败,因为 用户id 必须在场
      • 即使我们绕过上面提到的,电视也会有一段时间没有ID——真糟糕

    有什么好办法吗?

    1 回复  |  直到 16 年前
        1
  •  2
  •   Matt Van Horn    16 年前

    这个有什么问题吗?

    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
    

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

    推荐文章