嵌套路由路径是否依赖于模型?

时间:2012-05-28 01:57:23

标签: ruby-on-rails ruby-on-rails-3

我使用ror 3.2并希望将在其自己的文件夹中用于管理目的的控制器分开但使用与公共控制器使用的相同模型。我遇到了一个问题,我将在这里解释。我以不同的方式解决了问题,但这更好地解释了它。

Fresh rails app,我跑:

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

现在让我感到困惑的是什么。让我们通过界面输入一个数据行。假设统计数据在模型/而不是模型/管理员。我更改并移动了类,重命名了表并将控制器的索引方法更改为此(以反映新模型)

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

为什么我再次访问同一个网址时会看到此现有方法的错误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作为对象,为自己找到了一个解决方案,但我仍然想知道为什么会中断这个模型)

1 个答案:

答案 0 :(得分:1)

您运行的rails scaffold命令会生成在admin下命名的stat模型,即Admin :: Stat。

Rails使用此模型名称生成路径名称。因此,当您将模型更改为简单的Stat并将其传递给link_to辅助方法时,

link_to 'Show', admin_stat

admin_stat只是变量的名称,这里没关系。 admin_stat是Stat类的对象,因此它查找stat_path。

如果您想要网址中的admin/stats,则需要将routes.rb修改为

    scope "/admin" do
      resources :stats
    end