Ruby on rails 模型中的单位化常数

Ruby on rails 模型中的单位化常数,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-3.1,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby On Rails 3.1,我有一个使用Mongoid的非常简单的模型。我添加了red地毯的用法来解析MD并存储它。但是,在更新_属性期间,它会引发异常。运行模型并通过rails c运行更新工作正常 class Post include Mongoid::Document field :contents_markdown field :contents key :title before_create :markdown before_save :markdown protected

我有一个使用Mongoid的非常简单的模型。我添加了red地毯的用法来解析MD并存储它。但是,在更新_属性期间,它会引发异常。运行模型并通过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

编辑-
在运行测试和通过控制台运行时,这一切都可以正常工作。然而,通过控制器更新/创建模型似乎总是失败。此外,从stacktrace中,您可以看到模型位于标准位置。

您可以尝试将
红地毯.new
更改为
::red地毯.new
,这将告诉Ruby查找顶级常量
红地毯
。我认为这可能会解决问题,但问题可能更复杂。

您可能缺少
require
gem
声明,具体取决于您使用
红地毯的方式

如果Rails自动加载器是在标准位置(如
app/models
或可选的
lib/
)中定义的,则Rails自动加载器通常会捕获这些


通常,您可以通过将适当的
require
语句放入
config/initializers/red地毯.rb
类型文件中,或根据需要更改
gempec
来解决此问题。

Ruby将搜索父名称空间,但通常会在原始名称空间中报告错误。当存在冲突声明时,使用
::redrupt
非常有用,但在这种情况下,根本没有定义,并且自动加载程序无法捕获它。当我更改它时,出现了以下异常<代码>未初始化的常数红地毯
我在模型中遇到了类似的错误,并通过这样做修复了它们。我认为使用autoload时有时会有些奇怪,autoload在Rails中被大量使用。我还没有详细了解为什么它会修复它,但有时会。在控制台中测试时,您是在新的控制台会话中,还是已经尝试了其他一些东西?尝试退出并重新启动控制台,看看是否出现相同的错误。是的,我尝试过关闭并重新打开它。使用该模型的Rspec测试也都很好。我的gem文件中有gem依赖项。该模型在运行
rails c
时工作。我注意到,有时声明
gem
是必要的,以使
require
从正确的路径加载,但是
require
仍然必须完成。控制台环境可能有不同的
$LOAD\u路径
或自动加载设置。谢谢。我在初始值设定项中添加了一个require,这就解决了它。我会尽快接受你的答复。