2011-04-11 5 views
0

이 문제가 발생했습니다. 다른 오류가 발생할 때마다 을 시도했지만 많은 오류가있었습니다.mongoid를 사용하여 Doc로 개체를 푸시했을 때 NoMethodError

환경 :

@user = User.where(:email => params[:user][:email]) 
if @user.count > 0 
    @user.companies.push(@company) 
    @user.save 
    @company.users.push(@user) 
    @company.save 
else 
    @user = User.create(:name => params[:user][:name], 
         :email => params[:user][:email], 
         :password => "123456") 

    @user.companies.push(@company) 
    @user.save 
    @company.users.push(@user) 
    @company.save 
end 

: 내 UserController 방법에

레일 3.0.5

Mongoid 2.0.1

class User 
include Mongoid::Document 

field :name 

has_and_belongs_to_many :companies 
end 

class Company 
include Mongoid::Document 

field :name 

has_and_belongs_to_many :users 
end 

나는 이런 식으로 뭔가를 수행 만들기 사용자가 존재하지 않을 때 훌륭한 작품.

그러나 사용자가 이미 DB에있는 경우 오류가 발생합니다.

NoMethodError in UserController#create 
undefined method `companies' for #<Array:0x10679f638> 

결국 개체를 문서로 푸시합니다.

내가 누락 된 부분을 모르겠다.

누군가가이 문제를 해결하는 방법을 알고 있다면 ... 좋을 것입니다.

미리 감사드립니다.

+0

'User.where'는'@ user'에 할당 된 배열을 반환합니다. –

답변

0

이 시도 :

보조 노트에
@user = User.where(:email => params[:user][:email]).first 

, 당신은 또한 당신의 모델 중 하나에이 코드의 일부를 밀어 할 수 있습니다, 어느 사용자 또는 회사 모델을, 그래서 당신의 컨트롤러 만 것 사용자를 추가의 구현 세부 사항은 다음 모델에 캡슐화 될

@company.add_user(@user) 

: 같은 하나의 호출이있다.

ActiveRecord :: Base # save에 대한 두 번의 호출을 단일 트랜잭션에 포함시켜 데이터베이스에서 일치하지 않는 데이터로 끝내지 않도록 할 수도 있습니다.

+0

고마워요. 그것은 잘 작동합니다. 이제이 코드를 모두 리펙토링 할 수 있습니다. – guivinicius

관련 문제