Rails 3控制器和模型子文件夹

时间:2012-07-04 15:17:22

标签: ruby-on-rails activerecord rails-routing

我正在编写一个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模块有关,但我无法理解为什么它阻止了模型的创建。如果需要,我希望在控制器和模型文件夹中的目录结构中具有一致性。

1 个答案:

答案 0 :(得分:1)

由于Post位于postnsp目录中,因此它期望模型也可以由命名空间确定范围。

尝试将Post更改为Postnsp::Post < ActiveRecord::Base

<强>更新

好的,我试过一个应用程序来完成你所说的,我想我知道出了什么问题...... 由于您位于命名空间控制器内,当您使用Post时,它实际上会查找Postnsp::Post,为了使用基类,您必须使用::Post,然后一切都适合我。< / p>

希望这有帮助。