1

我正在编写一个 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

当我调用 URL 时:

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:将模型构建到子文件夹中而不创建子模块的优雅方式

并添加

config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**}')]

到我的 application.rb 文件

对于第二个(失败)示例,相关文件如下:

post.rb:

class Post < ActiveRecord::Base
  attr_accessible :content, :name
end

post_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

路线.rb:

Test::Application.routes.draw do
  namespace :postnsp do resources :posts end

谁能解释为什么子目录不能相同?我认为这与为 posts_controller.rb 创建 postnsp 模块有关,但我不明白为什么它会阻止创建模型。如果需要,我希望控制器和模型文件夹中的目录结构命名保持一致。

4

1 回答 1

1

由于Postpostnsp目录中,因此它希望模型也受命名空间的限制。

尝试将您的更改PostPostnsp::Post < ActiveRecord::Base

更新

好的,我尝试了一个应用程序来完全按照你说的做,我想我知道出了什么问题......因为你在一个命名空间控制器中,当你使用Post它时实际上会查找Postnsp::Post,为了使用你必须使用的基类::Post然后一切都对我有用。

希望这可以帮助。

于 2012-07-04T15:21:49.897 回答