developer tip

Rails : has_one 연관 생성

optionbox 2020. 8. 31. 07:41
반응형

Rails : has_one 연관 생성


안녕하세요 (여기에 거대한 Rails 초보자), 다음 모델이 있습니다.

class Shop < ActiveRecord::Base
  belongs_to :user
  validates_uniqueness_of :title, :user_id, :message => "is already being used"
end

class User < ActiveRecord::Base
  has_one :shop, :dependent => :destroy
end

새 상점을 만들려고 할 때 다음 오류가 발생합니다.

private method `create' called for nil:NilClass

이것은 내 컨트롤러입니다.

@user = current_user
@shop = @user.shop.create(params[:shop])

여기저기서 가이드와 튜토리얼을 읽으면서 다양한 변형을 시도했지만 이전보다 더 혼란스럽고 작동하지 않습니다. 어떤 도움이라도 대단히 감사하겠습니다.


우선, 원하는 작업을 수행하는 방법은 다음과 같습니다.

@user = current_user
@shop = Shop.create(params[:shop])
@user.shop = @shop

이제 버전이 작동하지 않는 이유는 다음과 같습니다.

당신은 아마 사용자가 있었다면이 힘의 일이 있기 때문에 생각 has_many숍의 관계를 @user.shops.create(params[:shop]) 것입니다 작동합니다. 그러나 has_many관계와 has_one관계 에는 큰 차이가 있습니다 .

A의 has_many관계, shops당신은 사용자로부터 /에 상점을 추가하고 제거하는 데 사용할 수있는 방법이있는 액티브 컬렉션 객체를 반환합니다. 이러한 방법 중 하나는 create새 상점을 만들고 사용자에게 추가하는입니다.

has_one관계를 사용하면 이러한 컬렉션 개체가 아니라 단순히 사용자에게 속한 Shop 개체를 반환하거나 사용자에게 아직 상점이 없으면 nil을 반환합니다. Shop 객체도 nil도 create메소드 가 없기 때문에 관계에 create이런 방식으로 사용할 수 없습니다 has_one.


이를 수행하는 더 간결한 방법은 다음과 같습니다.

@user.create_shop(params[:shop])

Ruby on Rails 가이드에서 has_one추가 한 메서드를 참조하세요 .


당신이 원하는 경우 두 더 많은 방법 save대신 create:

shop = @user.build_shop
shop.save

shop = Show.new
shop.user = @user
shop.save

위의 답변에 추가하려면-

@user.create_shop(params[:shop])

위의 구문은 새 레코드를 생성하지만 이후에 유사한 기존 레코드를 삭제합니다.

또는 삭제 콜백을 트리거하지 않으려면

Shop.create(user_id: user.id, title: 'Some unique title')

스레드 가 도움 될 수 있습니다. 여기를 클릭하세요

참고 URL : https://stackoverflow.com/questions/3839779/rails-create-on-has-one-association

반응형