#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
.