Неопределенный метод в пользовательской модели разработки

Я новичок в рельсах и пытаюсь добавить ассоциацию own_to в мою модель Devise User. Ошибка, которую я получаю при попытке отобразить представление:

NoMethodError в Devise/registrations#edit undefined method `department_id' for #

Эта ошибка возникает в collection_select, на мой взгляд. Разве этот метод не предоставляется ассоциацией own_to?

Пользовательская модель

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable, :lockable and :timeoutable
  devise :invitable, :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me

  belongs_to :department
end

Изменить вид

%h2
  Edit #{resource_name.to_s.humanize}
= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f|
  = devise_error_messages!
  %p
    = f.label :email
    %br/
    = f.text_field :email
  %p
    = f.label :department
    %br/
    = collection_select(resource_name, :department_id, Department.all, :id, :name)
  %p
    ...

person tdahlke    schedule 21.01.2011    source источник


Ответы (4)


Это действительно должно сработать, у меня есть own_to :business на моей пользовательской модели, и аналогичная collection_for_select прекрасно работает. Единственное, о чем я могу думать, это то, что, возможно, ваши миграции еще не запущены, и у вас еще нет столбца user.department_id?

person njorden    schedule 21.01.2011
comment
Вы были правы, проблема в том, что я изменил миграцию после того, как она уже была запущена в этой базе данных. Я чувствую себя глупо сейчас. - person tdahlke; 21.01.2011
comment
О, рад, что это сработало! Иногда вторая пара глаз решает все ;-) - person njorden; 22.01.2011

Как уже упоминалось @njorden, обязательно сделайте следующее:

  1. выполнить миграцию, чтобы добавить department_id в таблицу пользователей
  2. attr_accessible :department_id разрешить массовое назначение через регистрационную форму редактирования
person naiverahim    schedule 15.08.2011

Это смотрит назад. collection_select подходит для has_many стороны ассоциации. Обратите внимание, что семантическая подсказка здесь заключается в том, что когда объект belongs_to другой объект, он является единственным. Никакой коллекции не происходит. Вы запрашиваете department и получаете один объект. С другой стороны, если ваш Department был установлен на has_many :users, то запрос пользователей даст вам список пользователей.

Взгляните на документацию для select. Они дают простой пример того, что вы пытаетесь сделать с отделами (в форме выбора автора для сообщения в блоге).

person jdl    schedule 21.01.2011

Просто чтобы добавить мой случай, у меня была аналогичная проблема. Изначально у каждого пользователя был отдел с id_department_id, затем я перешел на has_many и забыл удалить id_department_id из пользователя. Решение состояло в том, чтобы удалить id_department_id у пользователя.

person Allyl Isocyanate    schedule 16.09.2011