0

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

新鲜的 Rails 应用程序,我运行:

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

现在让我困惑的是什么。让我们通过界面输入一个数据行。假设 stats 在 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。

如果你想要admin/stats在 url 中,那么你需要将 routes.rb 修改为

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