вспомогательный метод, включенный в модель, выдает «неопределенную локальную переменную или метод `config’ для» ошибки

#ruby-on-rails-3

#ruby-on-rails-3

Вопрос:

У меня есть довольно сложный вспомогательный метод, который также необходим в модели. Я сделал это, просто включив несколько помощников в мою модель, но тот же подход не работает в Rails 3.0.7.

 module ContentsHelper
  def content_teaser record
    # it uses image_tag, truncate, raw, and some others.
  end
end

class Content < ActiveRecord::Base
  include ActionView::Helpers::TagHelper
  include ActionView::Helpers::UrlHelper
  include ActionController::UrlFor
  include ActionView::Helpers::TextHelper
  include ActionView::Helpers::RawOutputHelper
  include ActionView::Helpers::AssetTagHelper
  include ContentsHelper
  include Rails.application.routes.url_helpers

  def teaser
    content_teaser self.body        
  end
end
  

и информация об ошибке, которую я имею

 undefined local variable or method `config' for #<Content:0x10bac7248>
app/helpers/contents_helper.rb:8:in `content_teaser'
app/models/content.rb:70:in `teaser'
  

есть предложения / рекомендации?

Комментарии:

1. Я бы посоветовал вам реструктурировать свой код — в общем, помощники должны быть только для представлений.

2. @Ant Благодарю вас за предложение. Но мне действительно это нужно для выполнения определенной работы. Этот метод действительно генерирует тизерную версию контента. Я использую его как для презентации, так и для хранения тизера в модели для кэша.

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

4. @Ant Это возможный вариант, но я не уверен, что создание html-кода в модели является хорошим подходом. В любом случае, спасибо за предложение. Однако мы решили удалить эту функцию по другой причине. Так что я отложил это на некоторое время.

Ответ №1:

Я также столкнулся с ошибкой при работе с Rails 3.1 RC

 NameError:
   undefined local variable or method `config'
  

Некоторые трассировки исходного кода Rails, и я обнаружил, что отсутствует, включают ActionView::AssetPaths.

 include ActionView::AssetPaths
include ActionView::Helpers::AssetTagHelper
  

Комментарии:

1. В Rails 3.1.1 это вызывает эту ошибку: in 'include': wrong argument type Class (expected Module) (TypeError) так что, я думаю AssetPaths , стал классом.

2. @PaulAnnesley здесь то же самое, работает после добавления include Sprockets::Helpers::RailsHelper и include Sprockets::Helpers::IsolatedHelper ( github.com/jnicklas/carrierwave/pull/529 )

3. @hakunin столкнулся с той же проблемой в основных тестах Spree ecommerce gem, и это исправило ее.

4. Спасибо @hakunin, это сработало на славу! К вашему сведению: я обнаружил, что мне нужно только include Sprockets::Helpers::IsolatedHelper .