Как я могу исправить NoMethodErrod на Controller # create, вызванном FriendlyId - PullRequest
1 голос
/ 17 июля 2011

У меня есть приложение rails, которое использует гем FriendlyId, и недавно я начал получать NoMethodErrors при разработке и тестировании. Эта проблема началась только недавно, и мы делаем несколько итераций в проекте («постановка», которая на герою все еще работает).

Проблема возникает при создании новой записи любой модели, настроенной для дружественных идентификаторов. Вот одна из тех моделей:

class Playlist < ActiveRecord::Base

  attr_accessible :title, :drill_tokens, :program, :order  , :get_playlists
  validates_presence_of :title
  validates_uniqueness_of :title

  has_many :playlist_items, :dependent => :destroy, :order => :id
  has_many :drills, :through => :playlist_items

  attr_reader :drill_tokens
  attr_reader :get_playlists

  def drill_tokens=(ids)
    self.drill_ids = ids.split(",")
  end

  has_friendly_id :title, :use_slug => true

end

Я получаю сообщение об ошибке при запуске теста NoMethodError в PlaylistsController # create Текст сообщения об ошибке:

You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each

И здесь начинается трассировка:

friendly_id (3.2.1.1) lib/friendly_id/active_record_adapter/slug.rb:53:in `enable_name_reversion'
activesupport (3.0.7) lib/active_support/callbacks.rb:415:in `_run_save_callbacks'

Я подтвердил, что он связан с гемом friendly_id, поскольку закомментировал строку has_id и вызов create снова работает. Я также попробовал связанные задачи рейка: работает

rake friendly_id:redo_slugs MODEL=playlist

выдает мне ту же ошибку. Альтернативно, запустив down-миграцию на таблице слагов и повторно запустив rails g friendly_id и up -igration, затем запустив

rake friendly_id:make_slugs MODEL=playlist

полностью убивает таблицу, и с тех пор просто попробуйте плейлист # Действие show вызывает ту же ошибку.

Надеюсь, это достаточно подробно. Я полностью сбит с толку относительно того, как вернуться в рабочее состояние.

...