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
'developer tip' 카테고리의 다른 글
URI [/WEB-INF/pages/apiForm.jsp] [duplicate]가있는 HTTP 요청에 대한 매핑이 없습니다. (0) | 2020.08.31 |
---|---|
확인하는 동안 오류가 발생했습니다. (0) | 2020.08.31 |
블룸 필터를 사용하면 어떤 이점이 있습니까? (0) | 2020.08.31 |
CSS 필터 : 투명한 흰색으로 컬러 이미지 만들기 (0) | 2020.08.31 |
Rails에서 to_json을 재정의하는 방법은 무엇입니까? (0) | 2020.08.31 |