الحصول على الحقول_FOR وقبول_المساعدة_Attribute_for للعمل مع علاقة ينتمي
-
19-09-2019 - |
سؤال
لا أستطيع أن أحصل على نموذج متداخل لتوليد في عرض القضبان ل belongs_to
العلاقة باستخدام الجديد accepts_nested_attributes_for
منشأة القضبان 2.3. أتحقق من العديد من الموارد المتاحة ويبدو وكأنها الكود ينبغي أن تعمل، ولكن fields_for
ينفجر علي، وأظن أنه لديه علاقة مع كيف يمكنني تكوين النماذج المتداخلة.
الخطأ الذي تضغط عليه هو واحد مشترك يمكن أن يكون لديه العديد من الأسباب:
'@account[owner]' is not allowed as an instance variable name
فيما يلي النموذجان المعنيان:
class Account < ActiveRecord::Base
# Relationships
belongs_to :owner, :class_name => 'User', :foreign_key => 'owner_id'
accepts_nested_attributes_for :owner
has_many :users
end
class User < ActiveRecord::Base
belongs_to :account
end
ربما هذا هو المكان الذي أقوم به "Rong"، كحساب يمكن أن يحتوي على "مالك"، و "المستخدمين"، ولكن المستخدم لديه فقط حساب واحد "حساب واحد"، بناء على مفتاح حساب نموذج المستخدم.
هذا هو رمز العرض في new.html.haml التي تفجرني:
- form_for :account, :url => account_path do |account|
= account.text_field :name
- account.fields_for :owner do |owner|
= owner.text_field :name
وهذا هو رمز تحكم للعمل الجديد:
class AccountsController < ApplicationController
# GET /account/new
def new
@account = Account.new
end
end
عندما أحاول تحميل / حساب / جديد أحصل على الاستثناء التالي:
NameError in Accounts#new
Showing app/views/accounts/new.html.haml where line #63 raised:
@account[owner] is not allowed as an instance variable name
إذا حاولت استخدام طريقة "بناء" غامضة، فإنها مجرد قنابل في وحدة التحكم، وربما لأن البناء هو مجرد علاقات متعددة السجلات:
class AccountsController < ApplicationController
# GET /account/new
def new
@account = Account.new
@account.owner.build
end
end
You have a nil object when you didn't expect it!
The error occurred while evaluating nil.build
إذا حاولت ضبط هذا الأمر باستخدام @ account.owner_attributes = {} في وحدة تحكم، أو @ account.owner = user.new، أعود إلى الخطأ الأصلي، "Uscount [المالك] غير مسموح به كمثال اسم المتغير".
هل لدى أي شخص آخر قبول القبول الجديد_Attributes_for الطريقة التي تعمل مع علاقة ينتمي؟ هل هناك شيء خاص أو مختلف عليك القيام به؟ جميع الأمثلة الرسمية وعينة التعليمات البرمجية (مثل أشياء رائعة على قصاصات ريان) يهتم بجمعيات متعددة القياسية.
المحلول
أعتقد لك accepts_nested_attributes
على الجانب الخطأ من العلاقة. ربما شيء من هذا القبيل من شأنه أن يعمل؟
class Account < ActiveRecord::Base
belongs_to :owner, :class_name => 'User', :foreign_key => 'owner_id'
has_many :users
end
class User < ActiveRecord::Base
belongs_to :account
has_one :account, :foreign_key => :owner_id
accepts_nested_attributes_for :account
end
لبناء الحساب الذي تريد استخدامه Build_Account.
يمكنك أن ترى المزيد من الأمثلة في المستندات.
نصائح أخرى
أنا متأخرة بضعة أشهر جدا، لكنني كنت أتطلع إلى حل هذا الخطأ وكان وضعي أنني لم أتمكن من تغيير العلاقة ب "مواجهة الطريقة الأخرى".
الجواب بسيط حقا، عليك القيام بذلك في عملك الجديد:
@account.build_owner
السبب وراء عدم عرض النموذج باستخدام الحقول_FOR لأنه لم يكن لديه كائن صالح. كان لديك الفكرة الصحيحة هناك مع:
@account.owner.build
ومع ذلك، هذه ليست هي الطريقة belongs_to
الشغل. يتم إنشاء هذه الطريقة فقط مع has_many
و has_and_belongs_to_many
.
المرجعي:http://guides.rubyonraina.org/association_basics.html#belongs-castion-association-areference.
أنا أستخدم القضبان 2.3.5 ولاحظت نفس الشيء. تحقق من مصدر Active_record's Nested_Attributes.rb، يبدو أنه ينتمي_ إلى أن تعمل بشكل جيد. لذلك يبدو أنه قد يكون خطأ "أشكال متداخلة".
لدي شكل متداخل تماما مثل لك، مع User belongs_to :address
, ، و Address
مستقل عن المستخدم.
ثم في النموذج، أنا فقط أفعل <% f.fields_for :address_attributes do |address_form| %>
بدلاً من <% f.fields_for :address do |address_form| %>
. وبعد الاختراق المؤقت حتى هناك طريقة أفضل، ولكن هذا يعمل. طريقة accepts_nested_attributes_for
يتوقع أن تضم المعالم شيئا مثل:
{user=>{address_attributes=>{attr1=>'one',attr2=>'two'}, name=>'myname'}
...لكن fields_for
ينتج:
{user=>{address=>{attr1=>'one',attr2=>'two'}, name=>'myname'}
بهذه الطريقة لا تضطر إلى إضافتها has_one :account
إلى التعليمات البرمجية الخاصة بك، والتي لا تعمل في حالتي.
تحديث: وجدت إجابة أفضل:
هنا هو GIST من الرمز الذي أستخدمه لجعل هذا العمل صحيح:
القضبان أشكال متداخلة مع ينتمي_ إلى GIST
امل ان يساعد.
class Account < ActiveRecord::Base
belongs_to :owner :class_name => 'User', :foreign_key => 'owner_id'
end
انه يعمل بالنسبة لي. : joint_key => 'oyal_id' هو المشكلة الرئيسية في حالتي.