1

私はこのルートファイルを持つエンジンを持っています:

Rails.application.routes.draw do
  resources :comments, :controller => 'opinio/comments'
end

タスクを実行するとrake routes、正しい出力が得られます

     comments GET    /comments(.:format)           {:action=>"index", :controller=>"opinio/comments"}
              POST   /comments(.:format)           {:action=>"create", :controller=>"opinio/comments"}
  new_comment GET    /comments/new(.:format)       {:action=>"new", :controller=>"opinio/comments"}
 edit_comment GET    /comments/:id/edit(.:format)  {:action=>"edit", :controller=>"opinio/comments"}
      comment GET    /comments/:id(.:format)       {:action=>"show", :controller=>"opinio/comments"}
              PUT    /comments/:id(.:format)       {:action=>"update", :controller=>"opinio/comments"}
              DELETE /comments/:id(.:format)       {:action=>"destroy", :controller=>"opinio/comments"}

私のコントローラーはとてもシンプルです:

class Opinio::CommentsController < ApplicationController
  include Opinio::Controllers::InternalHelpers

  def index
    resource.comments.page(params[:page])
  end

  def create
    @comment = resource.comments.build(params[:comment])
    @comment.user = current_user
    if @comment.save
      flash[:notice] = I18n.translate('opinio.comment.sent', :default => "Comment sent successfully.")
    else
      flash[:error]  = I18n.translate('opinio.comment.error', :default => "Error sending the comment.")
    end
  end
end

しかし、エンジンのコントローラーに送信されるアクションを使用しようとすると、次のエラーが発生します。

uninitialized constant Comment::CommentsController

RailsがこのComment名前空間をコントローラーのどこに魔法のように追加しているかは本当にわかりません。また、これを解決する方法もわかりません。

4

1 に答える 1

2

うわー、これは答えに値するので、誰も私がしたような愚かさをすることはありません。

基本的に、これをエンジンのモジュールに追加しました。

mattr_accessor :name
@@name = "Comment"

内部的には、すべてのモジュールにすでにメソッドがありnameますが、これを誤ってオーバーライドして、すべてのエラーを引き起こしました。ASは欠落している定数をロードしようとしましたがname、Opinioモデル内で呼び出されたときに、"Comment"の代わりに取得されましたOpinio

私自身とそこにいる他の人へのリマインダー。明白な名前と属性がすでに最初に存在するかどうかを確認せずに使用しないでください。

于 2011-04-06T12:48:16.570 に答える