[Rails tips] accepts_nested_attributes_for嵌套属性

更新一下这个文章:

  1. Rails 5 之后的 belongs_to 增加了一个 optional 选项 。想使用嵌套创建不报 "must exist" 的 error message 那么这个optional: true 必须设置

  2. 增加一对多关联的例子

class Event < ApplicationRecord
  has_many :items
  accepts_nested_attributes_for :items
end

class Item < ApplicationRecord
  belongs_to :event, optional: true
end
params example:

  "event": {
    "name": "我天真无邪的事件",
    "items_attributes": [
      {
        "at": "2019-12-12 18:00:00",
        "value": 11
      },
      {
        "at": "2019-12-12 18:01:00",
        "value": 12
      }
    ]
  }

strong params:


params.require(:event).permit(:name, items_attributes: [:at, :value])

@event = Event.create( params.require(:event).permit(:name, items_attributes: [:at, :value]) )

简单的更新一下 。不做详细解释了 。以上

accepts_nested_attributes_for 类方法 这个方法可以在该model上生成一个属性writer
eg:

为model Book新增两个新方法

author_attributes=(attributes)
page_attributes=(attributes)

class Book < ActiveRecord::Base
    has_one :author
    has_many :pages

    accepts_nested_attributes_for :author, :pages
end

一对一关联

class Member < ActiveRecord::Base
    has_one :avatar

    accepts_nested_attributes_for :avatar
end

开启了一对一的关联嵌套之后可以用这样的方法一次性创建Member

params = { :member => { :name => "Jack", :avatar_attributes => { :icon => "test"} } }

下面是create

member = Member.create(params[:member])

params = { :member => { :avatar_attributes => { :id => '2', :icon => "sad" } } }
member.update_attributes(params[:member])

你可能感兴趣的:([Rails tips] accepts_nested_attributes_for嵌套属性)