2012-07-04 61 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

相關問題