0

私はror 3.2を使用しており、管理目的で使用するコントローラーを独自のフォルダーに分離したいと考えていますが、パブリックコントローラーが使用するのと同じモデルを使用しています。ここで説明する問題に遭遇しました。私は別の方法で問題に遭遇しましたが、これはそれをよりよく説明しています。

新しいレールアプリ、私は実行します:

rails generate scaffold admin/stats name:string value:string

それが作成する他のすべてのファイルの中で:

create    app/models/admin/stat.rb

すべてが下で動作します:

localhost:3000/admin/stats/

次のルートが表示されます。

 admin_stats GET    /admin/stats(.:format)          admin/stats#index
            POST    /admin/stats(.:format)          admin/stats#create
new_admin_stat GET  /admin/stats/new(.:format)      admin/stats#new
edit_admin_stat GET /admin/stats/:id/edit(.:format) admin/stats#edit
 admin_stat GET     /admin/stats/:id(.:format)      admin/stats#show
            PUT     /admin/stats/:id(.:format)      admin/stats#update
            DELETE  /admin/stats/:id(.:format)      admin/stats#destroy

そしてここに私のroutes.rbファイル:

SampleApp::Application.routes.draw do
 namespace :admin do resources :stats end
 namespace :admin do resources :users end
 root :to => 'welcome#index'
end

今、何が私を困惑させます。インターフェイスを介して 1 つのデータ行を入力してみましょう。統計が models/ の下にあり、models/admin の下にないと仮定します。クラスを変更して移動し、テーブルの名前を変更し、コントローラーのインデックスメソッドをこれに変更しました(新しいモデルを反映するため)

def index
 @admin_stats = Stat.all #was Admin::Stat.all

 respond_to do |format|
  format.html # index.html.erb
  format.json { render json: @admin_stats }
 end
end

同じ URL localhost:3000/admin/stats/ に再度アクセスすると、存在しないメソッドのこのエラーが表示されるのはなぜですか?

 NoMethodError in Admin/stats#index

 Showing [...]/sample_app/app/views/admin/stats/index.html.erb where line #16 raised:
 undefined method `stat_path' for #<#<Class:0x007fe96d51a348>:0x007fe96d53a1e8>
 ...
 16:     <td><%= link_to 'Show', admin_stat %></td>

ビュー ファイルには触れていませんが、オブジェクトはまだ @admin_stats と呼ばれており、「rake routes」で作成されたルートは期待どおりです。なぜ壊れているのですか?(通常のモデルを単純に継承する各モデルの管理モデルを持ち、オブジェクトとして Admin::Stat を使用するだけで解決策を見つけましたが、これが壊れる理由を理解したいと思っています)

4

1 に答える 1

1

実行した rails scaffold コマンドは、admin の下にネームスペースが設定された stat モデル、つまり Admin::Stat を生成します。

Rails は、このモデル名を使用してルート名を生成します。したがって、モデルを単に Stat に変更して link_to ヘルパー メソッドに渡すと、

link_to 'Show', admin_stat

admin_stat は単なる変数の名前であり、ここでは問題になりません。admin_stat はクラス Stat のオブジェクトであるため、stat_path を探します。

URL に が必要な場合admin/statsは、routes.rb を次のように変更する必要があります。

    scope "/admin" do
      resources :stats
    end
于 2012-05-28T11:45:39.303 に答える