الحصول على الحقول_FOR وقبول_المساعدة_Attribute_for للعمل مع علاقة ينتمي

StackOverflow https://stackoverflow.com/questions/1313149

سؤال

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

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