NoMethodError, когда я помещаю объект в документ с монгоидом - PullRequest
0 голосов
/ 12 апреля 2011

У меня возникла эта проблема, я пробовал много разных подходов, но каждый раз, когда он попадает в эту ошибку.

Enviroment:

Рельсы 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 

В моем методе UserController Создать я делаю что-то вроде этого:

@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 

Когда пользователь не существует, он отлично работает.

Но если пользователь уже находится в БД, выдается ошибка.

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

Но в конце концов это толкает объект в документ.

Я не знаю, что я что-то упустил.

Если кто-то знает, как это решить ... будет здорово.

Заранее спасибо.

1 Ответ

0 голосов
/ 12 апреля 2011

Попробуйте это:

@user = User.where(:email => params[:user][:email]).first

В дополнение к этому, вы также можете захотеть вставить часть этого кода в одну из ваших моделей, либо модель User или Company, чтобы в вашем контроллере был только один вызов, такой как:

@company.add_user(@user)

Детали реализации добавления пользователя будут инкапсулированы в вашей модели.

Вы также можете рассмотреть возможность встраивания двух вызовов ActiveRecord :: Base # save в одну транзакцию, чтобы избежать несогласованности данных в вашей базе данных.

...