2011-09-27 93 views
0

我添加了一个管理员命名,以我的应用程序时,那么在登录到管理区域时,它会是这样:管理/网站和admin /页/ 8路由错误添加管理员命名空间

所以这是我在我的路线.rb

namespace :admin do |admin| 
    match '/' => 'dashboard#index' 
    resources :websites 
    resources :pages 
    resources :sessions 
    get 'login' => 'sessions#new', :as => 'login' 
    get 'logout' => 'sessions#destroy', :as => 'logout' 
end 

我在app/controllers目录中有admin_controller.rb。

class Admin::BaseController < ApplicationController 
    protect_from_forgery 
    include UrlHelper 
    ... 

我在app/controllers中创建了一个admin目录。所以我这里面的应用程序/控制器/管理/ websites_controller.rb

class Admin::WebsitesController < ApplicationController 

建议类联系一些其他的答案:: WebsitesController <联系:: BaseController,但从来没有为我工作。如果我错了,请告诉我。

因此,然后在我的布局文件(app/views/layouts/application.html.erb)我有像这样的链接edit_admin_website_path(@website)给我路由错误Routing Error No route matches {:action=>"edit", :controller=>"admin/websites"} Whyyyy ?! :(

+2

这个错误返回的url选项通常应该是'{:action =>“edit”,:controller =>“admin/websites”,:id => 3}'或者任何id,你能检查是否: '@ website'不是零,'@ website'被持久化(不是'new_record?') –

+0

您使用的是哪个版本的Rails? –

+1

一个巧妙的把戏:如果你发现'edit_admin_website_path(@website)'过于冗长,你可以使用(至少为url /链接助手):'[:edit,:admin,@website]' –

回答

3

在管理目录中添加一个名为application_controller.rb文件与此内容:

class Admin::ApplicationController < ApplicationController 
end 

然后,每个控制器这个目录上,扩展管理:: ApplicationController中类

您是否试过这个?

admin_edit_website_path(@website) 
+0

我比我更喜欢这个答案。 :) –

+0

对不起,关于路径,我已经在控制器中进行了更改,@ Web站点不再被加载。所以我刚创建了一个名为current_website的所有控制器可用的帮助方法,并将其编码为admin_edit_website_path(current_website) – leonel

+0

为什么这种方法会被认为更好? – leonel

1

Rails命名空间依赖于文件夹结构来加载正确的类。 ou应该像这样构造:

app/controllers 
    admin_controller.rb # class AdminController < ApplicationController 

app/controllers/admin 
    websites_controller.rb # class Admin::WebsitesController < AdminController 

AdminController应该在admin文件夹以外定义。如果把它放在那里,你不得不把它称为Admin::AdminController,这有点奇怪。事实上,你可以称之为AdminNamespaceController

你也可以使用rails generate这将在预期的地方为你设置,尽管我不认为它会为你创建名称空间基类继承。

+0

已更正。谢谢! – leonel