سؤال

وضجيجا رأسي ضد هذا واحد لفترة طويلة. على القضبان 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 ما هو نوع من نموذج للاستخدام.

وآمل أن يساعد هذا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top