Унифицированная константа в модели - PullRequest
0 голосов
/ 17 августа 2011

У меня очень простая модель с использованием 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 ]

1 голос
/ 17 августа 2011

Возможно, вам не хватает объявления require или gem, в зависимости от того, как вы используете Redcarpet.

. Автоматический загрузчик Rails обычно перехватывает их, если это определено в стандарте.например, app/models или, как необязательно, lib/.

Обычно это можно исправить, поместив соответствующий оператор require в файл типа config/initializers/redcarpet.rb или изменив свой Gemspec при необходимости..

1 голос
/ 17 августа 2011

Вы можете попробовать изменить Redcarpet.new на ::Redcarpet.new, что скажет Ruby искать константу верхнего уровня Redcarpet.Я думаю, что это, вероятно, исправит это, но возможно, что проблема является чем-то более сложным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...