Rails help create имеет много и принадлежит к assoction - PullRequest
1 голос
/ 15 мая 2011

Вот моя модель пользователя:

class User < ActiveRecord::Base
has_many :posts
end

Вот моя модель сообщения:

class Post < ActiveRecord::Base
before_create :ejer
belongs_to :user
def ejer
    self.user.build
end
end

Я использую devise, и когда я вошел в систему и пытаюсь создать сообщение, яполучает эту ошибку:

NoMethodError in PostsController#create

undefined method `build' for nil:NilClass

Я создал столбец user_id в таблице сообщений.

Почему я получаю сообщение об ошибке и как связать текущего пользователя, который выполнил вход, с сообщением?

Ответы [ 2 ]

0 голосов
/ 15 мая 2011

Судя по вашим комментариям в ответ на Марио, вы на самом деле не хотите создавать нового пользователя - это создаст новую запись.

Я рекомендую взглянуть на sentient_user gem . После того, как вы правильно подключили его в моделях и контроллерах, ваша модель сообщений может стать:

class Post < ActiveRecord::Base

  belongs_to :user
  validates :user, :presence => true

  before_validate do
    self.user ||= User.current_user
  end
end

Я изменил хук на before_validate и добавил проверку, чтобы убедиться, что есть связанный пользователь, поскольку в большинстве случаев не имеет смысла разрешать создание сообщения без идентификатора пользователя.

(о, и я уверен, что есть другие решения для получения User.current_user или аналогичного, sentient_user - это то, что я лично использую.)

0 голосов
/ 15 мая 2011

self.user будет nil, поэтому вы пытаетесь запустить метод build on nil, который вызовет исключение, которое вы получаете.

Чтобы добавить пользователя в сообщение, вы можете простоназначьте его, установив атрибут:

def ejer
  self.user = User.new
end

Вы также можете использовать метод build_user

def ejer
  build_user
end

или установить пользователя для существующего пользователя:

def ejer
  self.user = User.first
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...