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ファイルに

2 番目の (失敗した) 例では、関連するファイルは次のとおりです。

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

ルート.rb:

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

サブディレクトリが同じにならない理由を誰か説明できますか? posts_controller.rb の postnsp モジュールの作成と関係があると思いますが、モデルの作成を妨げている理由がわかりません。必要に応じて、コントローラー フォルダーとモデル フォルダーの両方で、ディレクトリ構造の名前付けに一貫性を持たせたいと考えています。

4

1 に答える 1

1

Postはディレクトリにあるためpostnsp、モデルも名前空間によってスコープされることが期待されます。

Postに変更してみてくださいPostnsp::Post < ActiveRecord::Base

アップデート

さて、私はあなたが言ったことを正確に実行するためにアプリを試しました.そして、私は何が悪いのか知っていると思いますPost.そして、すべてがうまくいきました。Postnsp::Post::Post

お役に立てれば。

于 2012-07-04T15:21:49.897 に答える