درابزون شكل مع ثلاثة نماذج ومساحة
-
07-07-2019 - |
سؤال
وضجيجا رأسي ضد هذا واحد لفترة طويلة. على القضبان 2.3.2، 1.9.1 روبي.
وتحاول استخدام نموذج واحد لخلق ثلاثة أشياء التي لديها هذه العلاقات:
class Person
has_one :goat
end
class Goat
belongs_to :person
has_many :kids
end
class Goat::Kid
belongs_to :goat
end
وفيما يلي ملخص للمخطط:
Person
first_name
last_name
Goat
name
color
Goat::Kid
nickname
age
وأود العمل #create
جهدي لمثيل حالات جديدة من جميع النماذج الثلاثة مع الجمعيات محدد. ومع ذلك، في حين يبدو أن بلدي التجزئة بارامس يتم تمريرها إلى وحدة تحكم كما يجب (على أساس سجلات المتتبع الخلفي في المتصفح عندما يفجر)، الكائن Goat::Kid
لا يجمعون على بارامس.
والاتحاد الدولي للرجبي (الدورة IRB هو مجرد الزائف تمثيل ما أحاول تحقيقه حتى إذا كان لا يدعو #save!
أو أي غيرها من الضروريات انها لم يقصد حقا أن تكون صحيحة، وأنا أحاول أن تفعل كل هذا من خلال المتصفح / نموذج ويب.)
a = Person.new :first_name => 'Leopold', :last_name => 'Bloom'
b = Goat.new :name => 'Billy', :color => 'white'
c = Goat::Kid.new :nickname => 'Jr.', :age => 2
a.goat.kids
>> []
والآن، لا أستطيع معرفة كيفية الحصول على وجهة نظر لتمرير بارامس على كل كائن وللحصول على وحدة تحكم لحفظ هذه بارامس إلى ديسيبل.
وأسئلتي: أ) هل هذا مكان جيد للاستخدام nested_attributes_for
وإذا كان الأمر كذلك كيف يمكنني أن تعلن مع مساحة الاسم؟ B) هل هناك طريقة أبسط من ذلك بكثير، وأسهل للفهم للقيام بذلك؟
تم تمرير بارامس إلى ثلاثة نماذج فقط صعبة للغاية بالنسبة لي ومهما الوثائق قرأت لا أستطيع أن التفاف رأسي حولها (#form_for
و#fields_for
). وcomplexifies مزيد من مساحة هذا. شكرا على اي مساعدة!
وإضافة: إذا أنا في نهاية المطاف معلنا
accepts_nested_attributes_for
ما هي الطريقة الصحيحة لاستخدام الوسيطة رمز لنموذج namespaced؟
accepts_nested_attributes_for :kids, :through => :goats
أو
accepts_nested_attributes_for :goats_kids, :through => :goats
أو
accepts_nested_attributes_for :goats::kids, :through => :goats
وأنا لست متأكدا كيف تترجم نماذج namespaced إلى معرفات رمزا لهم. شكرا!
المحلول
حسنا، هذه هي المرة الأولى يلعب مع accepts_nested_attributes_for
، ولكن مع قليل من اللعب في جميع أنحاء I كان قادرا على الحصول على شيء للعمل.
أولا إعداد نموذج:
class Person < ActiveRecord::Base
has_one :goat
accepts_nested_attributes_for :goat
end
class Goat < ActiveRecord::Base
belongs_to :person
has_many :kids
accepts_nested_attributes_for :kids
end
class Goat::Kid < ActiveRecord::Base
belongs_to :goat
end
ومع وحدة تحكم مريحة بسيط:
ActionController::Routing::Routes.draw do |map|
map.resources :farm
end
class FarmController < ApplicationController
def new
end
def create
person = Person.new params[:person]
person.save
render :text => person.inspect
end
end
وبعد ذلك يأتي على شكل شبه مجمع:
وبعد ذلك، إعداد النموذج:
<% form_for :person, :url => farm_index_path do |p| %>
<%= p.label :first_name %>: <%= p.text_field :first_name %><br />
<%= p.label :last_name %>: <%= p.text_field :last_name %><br />
<% p.fields_for :goat_attributes do |g| %>
<%= g.label :name %>: <%= g.text_field :name %><br />
<%= g.label :color %>: <%= g.text_field :color %><br />
<% g.fields_for 'kids_attributes[]', Goat::Kid.new do |k| %>
<%= k.label :nickname %>: <%= k.text_field :nickname %><br />
<%= k.label :age %>: <%= k.text_field :age %><br />
<% end %>
<% end %>
<%= p.submit %>
<% end %>
ومن النظر إلى مصدر للaccepts_nested_attributes_for
، يبدو أنه سيتم إنشاء طريقة لأنك يسمى #{attr_name}_attributes=
، لذلك كنت بحاجة إلى بلدي الإعداد fields_for
لتعكس ذلك (القضبان 2.3.3). بعد ذلك، الحصول على has_many :kids
العمل مع accepts_nested_attributes_for
. وتتطلع طريقة kids_attributes=
لمجموعة من الأشياء، لذلك كنت بحاجة لتحديد ارتباط مجموعة في شكل يدويا وأقول fields_for
ما هو نوع من نموذج للاستخدام.
وآمل أن يساعد هذا.