2011-08-16 12 views
0

私はモンゴイドを使用した非常に単純なモデルを持っています。 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を実行しています。

編集 - これは、テストを実行してコンソールから実行しても問題ありません。しかし、コントローラを更新してモデルを作成することは、常に失敗するようです。さらに、スタックトレースからは、モデルが標準の場所にあることがわかります。

答えて

1

Redcarpetの使用方法によっては、requireまたはgemの宣言が欠落している可能性があります。

Railsオートローダーは、一般的に、app/modelsのような標準的な場所に定義されている場合、またはオプションでlib/のように定義されています。

通常はconfig/initializers/redcarpet.rbタイプのファイルに適切なrequire文を入れたり、あなたGemspec、必要に応じてを変更することによってこの問題を解決することができます。

+0

私は私のGemfileに宝石の依存関係があります。モデルは 'rails c 'を実行しているときに動作します。 – tgandrews

+0

正しいパスから 'require'ロードを実行するために' gem'を宣言する必要があることに気がつきましたが、 'require'がまだ実行されていなければなりません。おそらく、コンソール環境には異なる '$ LOAD_PATH'やオートローダーの設定があります。 – tadman

+0

ありがとうございます。私はイニシャライザにrequireを追加し、これを修正しました。できるだけ早くあなたの答えを受け入れます。 – tgandrews

1

Redcarpet.new::Redcarpet.newに変更すると、Rubyにトップレベルの定数Redcarpetが検索されます。私はそれが解決する可能性が高いと思うが、問題はもっと複雑なものかもしれない。

+0

Rubyは親の名前空間を検索しますが、エラーは一般に元の名前空間で報告されます。 ':: Redcarpet'を使うと、矛盾する宣言がある場合に便利ですが、この場合は定義が全くなく、オートローダーはそれをつかんでいません。 – tadman

+0

変更したときに次の例外があります。 '初期化されていない定数Redcarpet' – tgandrews

+1

私はモデルで似たようなエラーを出しており、これを実行して修正しました。私はときどきRailsで頻繁に使用されるautoloadを使用するといくつかの奇妙なことがあると思います。私はそれがなぜそれを修正するのかの詳細を調べていないが、ときどきそれを行う。 – Emily

関連する問題