我正在编写一个Rails 3.2.6应用程序。我想将我的控制器和模型分成子文件夹以保持我的代码清洁。我确保模型及其子目录名称不相同。但是,如果控制器子目录名称和模型子目录名称相同,我发现代码失败。
以下应用程序结构正常工作:
test
app
controllers
postcnt
posts_controller.rb
models
postmdl
post.rb
但以下结构不会:
test
app
controllers
postnsp
posts_controller.rb
models
postnsp
post.rb
当我拨打网址时:
http://localhost:3000/postnsp/posts
我收到500错误消息:
LoadError in Postnsp::PostsController#index
Expected /Users/dev/code/test/app/models/postnsp/post.rb to define Postnsp::Post
在上面的例子中,我遵循了这里的建议来消除模型命名空间: Rails: Elegant way to structure models into subfolders without creating submodules
并添加了
config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**}')]
到我的application.rb文件
对于第二个(失败的)示例,相关文件如下:
post.rb:
class Post < ActiveRecord::Base
attr_accessible :content, :name
end
posts_controller.rb:
class Postnsp::PostsController < ApplicationController
def index
@posts = Post.all
respond_to do |format|
format.html # index.html.erb
format.json { render json: @posts }
end
end
routes.rb中:
Test::Application.routes.draw do
namespace :postnsp do resources :posts end
有谁可以解释为什么子目录不能相同?我认为这与为posts_controller.rb创建postnsp模块有关,但我无法理解为什么它阻止了模型的创建。如果需要,我希望在控制器和模型文件夹中的目录结构中具有一致性。
答案 0 :(得分:1)
由于Post
位于postnsp
目录中,因此它期望模型也可以由命名空间确定范围。
尝试将Post
更改为Postnsp::Post < ActiveRecord::Base
<强>更新强>
好的,我试过一个应用程序来完成你所说的,我想我知道出了什么问题......
由于您位于命名空间控制器内,当您使用Post
时,它实际上会查找Postnsp::Post
,为了使用基类,您必须使用::Post
,然后一切都适合我。< / p>
希望这有帮助。