복붙노트

[RUBY-ON-RAILS] belongs_to 관계와 일에 fields_for와 accepts_nested_attributes_for 얻기

RUBY-ON-RAILS

belongs_to 관계와 일에 fields_for와 accepts_nested_attributes_for 얻기

나는 레일은 레일 2.3의 시설 accepts_nested_attributes_for 새로운를 사용하여 belongs_to 관계를 볼에 생성하는 중첩 된 양식을 얻을 수없는 것. 내가 사용할 수있는 리소스의 많은 체크 아웃 않았고 내 코드가 작동해야처럼 보이지만 날 폭발 fields_for, 나가 구성된 중첩 된 모델을 얼마나 함께 할 수있는 뭔가가 있다고 생각한다.

오류 I 히트 많은 원인이있을 수있는 공통의 하나입니다

'@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

아마도 이것은 내가 사용자 모델 ACCOUNT_ID 키를 기반으로, 계정은 '주인'을 가질 수있는, '룽'그 일을하고, 할 수있다 '사용자',하지만 사용자가 하나의 '계정'가하고있는 곳입니다.

이것은 나에 불면 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, 내가 원래 오류 해요 "@account [소유자] 인스턴스로 허용되지 않습니다 변수 이름 ".

다른 사람은 방법은 belongs_to 관계와 협력 accepts_nested_attributes_for 새로운이 있습니까? 거기에 뭔가 특별하거나 다른 당신이해야 할인가? 모든 공식 예와 (Ryans 방명록에 걸쳐 큰 물건 등) 샘플 코드는 멀티 레코드 협회와 관련된다.

해결법

  1. ==============================

    1.나는 당신의 accepts_nested_attributes이 관계의 반대쪽에 생각합니다. 어쩌면이 같은 작동까요?

    나는 당신의 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을 사용하고 싶습니다.

    당신은 문서에서 더 많은 예제를 볼 수 있습니다.

  2. ==============================

    2.내가 너무 늦게 몇 달,하지만 난이 오류를 해결하기 위해 찾고 있던 내 상황은 내가 '얼굴 다른 방법'의 관계를 변경할 수없는 것이 었습니다.

    내가 너무 늦게 몇 달,하지만 난이 오류를 해결하기 위해 찾고 있던 내 상황은 내가 '얼굴 다른 방법'의 관계를 변경할 수없는 것이 었습니다.

    대답은 정말 매우 간단합니다, 당신은 당신의 새로운 액션에서이 작업을 수행해야합니다 :

    @account.build_owner
    

    유효한 개체를 가지고 있지 않았기 때문에 양식을 사용하여 fields_for를 표시하지 않은 이유였다. 당신은 거기 올바른 생각을했다 :

    @account.owner.build
    

    그러나이 작업 belongs_to 방법이 아니다. 이 방법은 has_many와 has_and_belongs_to_many 생성됩니다.

    참고: http://guides.rubyonrails.org/association_basics.html#belongs-to-association-reference

  3. ==============================

    3.나는 레일 2.3.5를 사용하고 있는데 나는 같은 일을 발견했습니다. active_record의 nested_attributes.rb의 소스를 체크 아웃, 그것은 belongs_to 잘 작동합니다 것 같습니다. 이 나타나는 그래서 그것은 "중첩 된 형태"버그가 있습니다.

    나는 레일 2.3.5를 사용하고 있는데 나는 같은 일을 발견했습니다. active_record의 nested_attributes.rb의 소스를 체크 아웃, 그것은 belongs_to 잘 작동합니다 것 같습니다. 이 나타나는 그래서 그것은 "중첩 된 형태"버그가 있습니다.

    나는 belongs_to 사용자와 정확히 당신처럼 중첩 된 형태를 갖는다 : 주소 및 주소는 사용자의 독립적이다.

    그런 형태로, 난 그냥 할 <% f.fields_for : address_attributes가 할 | address_form | %> 대신에 <% f.fields_for의 : 주소 할 | address_form | %>. 임시 더 나은 방법이 될 때까지 해킹,하지만 작동합니다. 메소드 accepts_nested_attributes_for 같은 것을 포함 할 PARAMS을 기대하고있다 :

    {사용자 => {address_attributes => {ATTR1 => '하나'ATTR2 => '개의'} NAME => 'MyName로'}

    ...하지만 fields_for을 생산하고있다 :

    {사용자 => {주소 => {ATTR1 => '하나'ATTR2 => '개의'} NAME => 'MyName로'}

    당신이없는이 방법은 has_one를 추가하려면 계정을 내 경우에는 작동하지 않는 코드에.

    업데이트 : 더 나은 답을 찾았습니다

    여기에 내가이 작품의 권리를 만들기 위해 사용하고 코드의 요점은 다음과 같습니다

    요점 belongs_to와 중첩 된 양식 레일

    희망이 도움이.

  4. ==============================

    4.

    class Account < ActiveRecord::Base
    
        belongs_to :owner  :class_name => 'User', :foreign_key => 'owner_id'
    end
    

    그것은 나를 위해 작동합니다. : foreign_key은> 'OWNER_ID'하는 내 경우에는 키 문제였다 =.

  5. from https://stackoverflow.com/questions/1313149/getting-fields-for-and-accepts-nested-attributes-for-to-work-with-a-belongs-to-r by cc-by-sa and MIT license