Как в Ruby on Rails назначить значение по умолчанию для члена member_of объекта ActiveRecord? - PullRequest
2 голосов
/ 28 декабря 2011

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

NoMethodError в Users :: RegistrationsController # create

неопределенный метод `name 'дляnil: NilClass Rails.root: / home / nathan / dev / legwork-core

Трассировка приложений |Framework Trace |Приложение Full Trace / models / contact.rb: 74: в block (2 levels) in <class:Contact>' app/models/user.rb:31:in update_contact '

Код вызова здесь:

  searchable do
    string :category do
      self.category.name
    end
  end

Категория должна быть экземпляром ContactCategory, ито, что я думаю, мне нужно, чтобы установить self.category по умолчанию, если его ноль.Я пытался это исправить:

  after_initialize :set_defaults

  def set_defaults
    self.category = ContactCategory.first if self.category.nil?
  end

Я также пытался:

  def after_initialize
    self.category = ContactCategory.first if self.category.nil?
  end

И я пробовал:

  before_create :set_defaults

  def set_defaults
    self.category = ContactCategory.first if self.category.nil?
  end

Кто-то еще предложил поставить этологика в before_save, но уже есть before_save, в котором есть эта логика, вот где я впервые увидел то, что автор намеревался использовать по умолчанию.

UPDATE:

Thisвопрос глупо теперь, когда я вижу, что не так.Я предполагал, что оператор присваивания никогда не выполнялся, потому что предполагал, что ContactCategory.first также не равен nil.К сожалению, все здесь работает, как ожидалось.Мораль этой истории такова:

Все крючки, которые я использовал для установки значения по умолчанию, работали правильно.Я бы порекомендовал использовать их для установки значения по умолчанию с помощью ActiveRecord.

Ответы [ 2 ]

1 голос
/ 28 декабря 2011

Я склонен использовать обратный вызов before_create для установки значений по умолчанию и еще много чего, но вот полный список обратных вызовов ActiveRecord из документов RoR API .Вы заметите, что after_initialize не работает так, как указывает его имя:

Наконец, обратный вызов after_find и after_initialize запускается для каждого объекта, который найден и создан искателем,с after_initialize, запускаемым после создания новых объектов.

Возможно, вы захотите использовать before_save или before_create вместо.

0 голосов
/ 28 декабря 2011

Кроме того, помните, что вы можете назначить значения по умолчанию (и убедиться, что поле никогда не равно NULL) и в процессе миграции. Вот пример из одного из моих собственных проектов :

class AddRolesMaskToUsers < ActiveRecord::Migration
  def self.up
    add_column :users, :roles_mask, :integer, :default => DEFAULT_ROLE, :null => false
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...