我使用 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 作为对象,但我仍然想了解为什么会这样)