みたいなことができるようになりたい
@foo = MyClass.new
5.times do
@foo.things.build
end
しかし、これを機能させるには@fooに主キーが必要です。オブジェクトを作成せずに主キーを生成する最良の方法は何ですか?
これの目的は、ネストされたフォームをより簡単に使用できるようにすることです
form_builder.fields_for :things do ...
みたいなことができるようになりたい
@foo = MyClass.new
5.times do
@foo.things.build
end
しかし、これを機能させるには@fooに主キーが必要です。オブジェクトを作成せずに主キーを生成する最良の方法は何ですか?
これの目的は、ネストされたフォームをより簡単に使用できるようにすることです
form_builder.fields_for :things do ...
OPは、標準Railsリソースの新しいアクションで使用するビューアクションプロパティを初期化する方法を求めていると思います. この時点では、メインの親の ID はありません。解決策は簡単です:
モデル:
class ParentObject < ActiveRecord::Base
# the child model in this example is called child_objects
has_many :child_objects, :dependent => :destroy
accepts_nested_attributes_for :child_objects
new のコントローラ アクション:
@object = Object.new :example_field => "my field"
@object.child_objects.build :name => "value_1" # pretending that name is a field
@object.child_objects.build :name => "value_2"
次に、ビューで:
= form_for(@object) do |f| # top level Object
= f.label :example_field
= f.text_field :example_field
=# the next line loops twice in this example
= f.fields_for :child_objects do |child|
= child.label :name
= child.text_field :name
Ryan Bates (https://github.com/ryanb/nested_form) によって作成された、nested_form という優れた gem もあり、残りの CRUD 操作に役立つ可能性があります。
あなたがおそらく欲しいのはNestedAttributesです
ネストされた属性を使用すると、親を介して関連するレコードに属性を保存できます。デフォルトでは、ネストされた属性の更新はオフになっていますが、を使用して有効にできますaccepts_nested_attributes_for class method
。ネストされた属性を有効にすると、モデルに属性ライターが定義されます。
実装は各ORM間で異なります。これは、続編とActiveRecord用です。
注:完全なチュートリアルはNerdgemでも入手できます
多くのタスクを持つProjectクラスがあると想像してください
class Project < Sequel::Model
one_to_many :tasks
end
class Task < Sequel::Model
many_to_one :project
end
ネストされた属性を有効にするには、Projectクラス用の2つのプラグインを含める必要があります
Sequel :: Plugins :: NestedAttributes: 現在のオブジェクトのメソッドを呼び出すことにより、関連するオブジェクトを直接作成、更新、および削除できます。ネストされた属性は、nested_attributesクラスメソッドを使用して定義されます。
Sequel :: Plugins :: InstanceHooks:これはNestedAttributesの依存関係です
プラグインサイトで本当に良いドキュメントを見つけることができます
Project.plugin :instance_hooks
Project.plugin :nested_attributes
nested_attributes
その後、目的のクラスでメソッドを呼び出すことができます
Project.nested_attributes :tasks
今、あなたはこれを行うことができます
p = Project.new(:title=>'Project')
p.tasks_attributes = [{:title=>'First Task'}, {:title=>'Second Task'}]
puts p.tasks.inspect
# It will output this
# [#<Task @values={:title=>"First Task"}>, #<Task @values={:title=>"Second Task"}>]
プロジェクトを保存すると、プロジェクトとタスクの両方が保存されます。
同時に多くのタスクを編集することさえできれば。
使い方はこちらです。
多くのタスクを持つProjectクラスがあると想像してください
Project.rb
class Project < ActiveRecord::Base
attr_accessible :title
has_many :tasks
accepts_nested_attributes_for :tasks
end
Task.rb
class Tasks < ActiveRecord::Base
attr_accessible :title, :project_id
belongs_to :project
end
今、あなたはこれを行うことができます。
p = Project.new
p.tasks_attributes=[{title: "First Task"}]
p.things
# Would output this
#=> [#<Thing id: nil, title: "First Task", created_at: nil, updated_at: nil, bar_id: nil>]
p.save
プロジェクトを保存すると、プロジェクトとタスクの両方が保存されます。
多くのプロジェクトタスクを同時に編集したい場合は、これを行うことができます
p.tasks_attributes=[{title: "First Task"},{title: "Second Task"}]
注:ネストされたフォームを支援するRailscastもあります。元のRailscast、改訂されたRailscast