2011-05-08 99 views
4

我正在使用ActsAsTaggableOn为我的应用程序添加标记。除了我从这个宝石中获得的功能之外,我还想添加一个TagsController,并且基本上将标记作为我应用中的任何其他资源。命名空间控制器在Rails-3中导致错误

我创建tags_controller.rb包含

class ActsAsTaggableOn::TagsController < ApplicationController 
    # ... 
end 

,并在我的routes.rb我已经添加

resources :tags, :module => :acts_as_taggable_on 

当我运行rake routes我得到

 
    tags GET /tags(.:format)    {:action=>"index", :controller=>"acts_as_taggable_on/tags"} 
     POST /tags(.:format)    {:action=>"create", :controller=>"acts_as_taggable_on/tags"} 
new_tag GET /tags/new(.:format)   {:action=>"new", :controller=>"acts_as_taggable_on/tags"} 
edit_tag GET /tags/:id/edit(.:format) {:action=>"edit", :controller=>"acts_as_taggable_on/tags"} 
    tag GET /tags/:id(.:format)   {:action=>"show", :controller=>"acts_as_taggable_on/tags"} 
     PUT /tags/:id(.:format)   {:action=>"update", :controller=>"acts_as_taggable_on/tags"} 
     DELETE /tags/:id(.:format)   {:action=>"destroy", :controller=>"acts_as_taggable_on/tags"} 

...这对我来说都很合理。

然而,当我打本地主机:3000 /标签我得到这个错误:

 
LoadError (Expected MyApp/tags_controller.rb to define TagsController) 

如果我尝试在控制台,以评估ActsAsTaggableOn::TagsController我得到基本相同的错误:

 
LoadError: Expected MyApp/app/controllers/tags_controller.rb to define TagsController 
    from ~/.rvm/gems/ruby-1.9.2-p180/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:492:in `load_missing_constant' 
    from ~/.rvm/gems/ruby-1.9.2-p180/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:183:in `block in const_missing' 
    from ~/.rvm/gems/ruby-1.9.2-p180/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:181:in `each' 
    from ~/.rvm/gems/ruby-1.9.2-p180/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:181:in `const_missing' 
    from ~/.rvm/gems/ruby-1.9.2-p180/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:503:in `load_missing_constant' 
    from ~/.rvm/gems/ruby-1.9.2-p180/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:183:in `block in const_missing' 
    from ~/.rvm/gems/ruby-1.9.2-p180/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:181:in `each' 
    from ~/.rvm/gems/ruby-1.9.2-p180/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:181:in `const_missing' 
    from (irb):1 
    from ~/.rvm/gems/ruby-1.9.2-p180/gems/railties-3.0.4/lib/rails/commands/console.rb:44:in `start' 
    from ~/.rvm/gems/ruby-1.9.2-p180/gems/railties-3.0.4/lib/rails/commands/console.rb:8:in `start' 
    from ~/.rvm/gems/ruby-1.9.2-p180/gems/railties-3.0.4/lib/rails/commands.rb:23:in `' 
    from script/rails:6:in `require' 
    from script/rails:6:in `' 

什么我做错了吗?

回答

1

Rails期望模块和类位于其名称空间的目录中。所以,你应该将你的控制器,观点和助手在acts_as_taggable_on目录:

  • app/controllers/acts_as_taggable_on/tags_controller.rb
  • app/views/acts_as_taggable_on/tags/index.html.erb

我不知道你为什么想要这个命名空间。如果您只想在现有模型上创建REST动作,则可以生成scaffold_controller。例如:

rails generate scaffold_controller Tag name:string 
+0

唉,将控制器移动到与命名空间名称相同的文件夹不起作用。它会导致“未初始化的常量ActsAsTaggableOn :: TagsController”错误。 – KaptajnKold 2011-05-16 12:31:56

+0

我需要名称空间,因为模型(来自gem)是名称空间。 – KaptajnKold 2011-05-16 12:33:08

0

Michaël对于名称空间控制器的目录结构是正确的。

这就是说,控制器不必与模型在同一个命名空间中。相反,您可以使用名为SomeController的控制器与名为SomeModel的模型一起工作。您是否已经尝试从控制器类中删除名称空间并查看出了什么问题?

+1

如果控制器与模型不在同一名称空间中,路由不起作用:edit_tag_path(@tag)导致

undefined method 'acts_as_taggable_on_tag_path'
错误。 – KaptajnKold 2011-05-19 06:06:52

+0

您是否还从routes.rb中删除了':module'参数? – Kris 2011-05-19 09:54:39

+0

是的。就我能说的问题而言,Rails使用模型名称(包括其名称空间)来生成URL。这就是为什么我认为将控制器放在与模型相同的命名空间中可能是正确的。 – KaptajnKold 2011-05-19 10:53:28

相关问题