Унитизированная константа в модели
У меня очень простая модель с использованием Mongoid. Я добавил использование Redcarpet для анализа MD и его сохранения. Однако во время update_attributes это вызывает исключение. Запуск модели и запуск обновления через rails c
работает отлично.
class Post
include Mongoid::Document
field :contents_markdown
field :contents
key :title
before_create :markdown
before_save :markdown
protected
def markdown
if self.contents_markdown
self.contents = Redcarpet.new(self.contents_markdown).to_html.html_safe
end
end
end
Вот контроллер, который взрывается.
def update
@post = Post.find(params[:id])
respond_to do |format|
if @post.update_attributes(params[:post])
format.html { redirect_to @post, notice: 'Post was successfully updated.' }
format.json { head :ok }
else
format.html { render action: "edit" }
format.json { render json: @post.errors, status: :unprocessable_entity }
end
end
end
Вот исключение и трассировка стека. Номера строк будут немного не такими, как я удалил вещи из модели.
uninitialized constant Post::Redcarpet
app/models/post.rb:20:in `markdown'
app/controllers/posts_controller.rb:62:in `block in update'
app/controllers/posts_controller.rb:61:in `update'
Если это имеет значение, я использую MRI 1.9.2-p290 и Rails 3.1-rc5.
Редактировать - все это прекрасно работает при запуске тестов и через консоль. Однако прохождение через контроллер для обновления / создания модели, похоже, всегда терпит неудачу. Кроме того, из стека трассировки видно, что модель находится в стандартном месте.
2 ответа
Вы можете пропустить require
или gem
декларация в зависимости от того, как вы используете Redcarpet
,
Автопогрузчик Rails обычно перехватывает их, если это определено в стандартном месте, например app/models
или, как необязательно, lib/
,
Обычно это можно исправить, поставив соответствующий require
заявление в config/initializers/redcarpet.rb
введите файл или измените Gemspec
как необходимо.
Вы можете попробовать изменить Redcarpet.new
в ::Redcarpet.new
который скажет Ruby искать константу верхнего уровня Redcarpet
, Я думаю, что это, вероятно, исправит это, но возможно, что проблема является чем-то более сложным.