2012-07-04 87 views
1

我正在编写一个Rails 3.2.6应用程序。我想分开我的控制器和模型到子文件夹,以保持我的代码清洁。我已确保模型及其子目录名称不相同。但是,如果控制器子目录名称和模型子目录名称相同,则会发现代码失败。Rails 3控制器和模型子文件夹

下面的应用程序结构正常工作:

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 

任何人都可以解释为什么子目录不能是一样的吗?我认为这与post_controller.rb的postnsp模块的创建有关,但我不明白为什么它阻止了模型的创建。我希望在控制器和模型文件夹中的目录结构命名方面保持一致,如果我需要的话。

+0

我认为它应该是'class Postnsp :: Post Zabba

+0

请参阅我对以下Draiken的回应。上面的两个例子都没有名称空间模型 - 其中一个是有效的,一个没有。我不想改变模型,而是想知道轨道设计中阻碍第二个变体的工作方式。 – benmac

+0

可能是由于自动加载在Ruby中的工作原理。这可能是您与“铁轨方式”战斗的领域之一(好或坏,没有评论!)。但为什么你想分开目录?除了“干净的感觉”之外,你还有什么成就? (“我确保模型和它的子目录名称是不一样的。”=>你已经与rails竞争过一次,期望更多!) – Zabba

回答

1

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

试着改变你的PostPostnsp::Post < ActiveRecord::Base

UPDATE

好吧,我试过一个应用程序来办,你告诉什么,我想我知道由于你在里面出了什么问题? 一个命名空间的控制器,当你使用Post时,它实际上会寻找Postnsp::Post,为了使用基类,你必须使用::Post然后一切都为我工作。

希望这会有所帮助。

+0

感谢您的回复,但我不想命名空间模型。我不希望数据库表命名为postnsp_posts(或者不得不在每个模型中重写表名),只是因为我已经将我的应用程序构建到了目录中。其他职位(包括我的问题中引用的职位)解释了如何避免名称空间模型,并且在Rails控制台中工作正常,但他们没有解决子文件夹中的控制器如何调用这些无名称空间模型。我真的很想知道为什么我的问题中的第一个目录结构起作用,而第二个目录结构不起作用。 – benmac

+0

更新了答案@benmac – Draiken

+0

我更新了我的posts_controller.rb代码,使用@post = :: Post.all,并没有什么区别(我同意它应该)。正如我在我的原始问题的评论中提到的,我的问题中的两个示例都适用于Rails 2.我真的很想知道在Rails 3(以及其中)的ApplicationController中更改了哪些内容以表示控制器命名空间。即使我可以使:: Post约定工作,我也不希望将代码中的每个引用都更改为“::”语法,以使其可以与Rails 3一起使用。我想知道是否存在简单的修复或配置来解决问题。 – benmac

相关问题