2014-08-29 67 views
2

我是Rails的新手,並且對命名空間的工作原理有點困惑。基本上我有類別和客戶控制器。如何在Rails中使用路由控制器進出名稱空間4

我想創建一個管理員命名空間(我還不知道),使某些方法只能通過/admin/products/id, via: 'delete'訪問(/admin/...是重要組成部分)的命名空間,而其他的幾種方法通常像這樣來訪問:/products, via: 'get'

如果我理解正確,爲了創建一個名稱空間,我需要創建一個子目錄並在這個目錄下有控制器,但是我想在這種情況下它將不再可以正常訪問?

這可能嗎?怎麼樣?

我試過(例如)

match '/admin/products', to: 'admin#index', via: 'get' 

,但它給了我一個錯誤說一個變量(模板)不可用。但是,當我嘗試沒有/admin它工作正常,這意味着問題是命名空間的情況。

+0

你能後你有確切的錯誤? – fivedigit 2014-08-29 21:06:31

+0

確切的錯誤是:'未定義的方法'電子郵件爲零:NilClass'這是由模板觸發(一個'@用戶'傳遞給模板)。傳遞的參數是:{「id」=>「customers」}在訪問/ admin/customers時告訴我路由未被識別 – WagnerMatosUK 2014-08-29 22:35:08

+0

檢查此鏈接。它真的幫助我理解http://blog.roberteshleman.com/2014/08/14/using-rails-namespaces-for-admin-actions/ – ryanb082 2015-09-23 14:35:11

回答

2

如果將以下命名空間添加到您的route.rb

namespace :admin do 
    resources : categories 
    resources : customers 
end 

可以在controllers/admin文件夾中創建以下控制器:

#base_controller.rb - will work like your application_controller for the namespace 
class Admin::BaseController < ActionController::Base 
    ... 
end 

#categories_controller.rb - will work like your categories_controller for the namespace 
class Admin::CategoriesController < Admin::BaseController 
    ... 
end 

#customers_controller.rb - will work like your customers_controller for the namespace 
class Admin::CustomersController < Admin::BaseController 
    ... 
end 

通過這種方式,可以在主控制器添加驗證,爲管理員提供完全訪問權限,並從非命名空間部分中移除像deleteedit之類的操作。

我希望它可以幫助...

+0

不幸的是,它沒有奏效。路線不被識別,我得到了相同的錯誤 – WagnerMatosUK 2014-08-29 22:35:57

0

一個namespace是你的控制器模塊的等價性。

簡單地說,你就必須做到以下幾點:

  • Put your namespaced controllers into a subdirectory of the same name
  • All your routes need to be sent through the namespaced helpers

這裏是如何做到這一點:


命名空間

你會在最佳位置通過閱讀namespacing from the Rails documents

我F你要拍的「admin」的命名空間,你會做以下的(我們用這個):

#config/routes.rb 
namespace :admin do 
    root "products#index" 

    resources :products, only: [:new, :create] 
    resources :customers, only: [:new, :create] 
end 

resources :products, only: [:index, :show] 
resources :customers, only: [:index, :show] 

這將創建一個號碼,你的路線;但那些命名空間將只提供

下面是如何構建你的控制器:

#app/controllers/admin/application_controller.rb 
class Admin::ApplicationController < ActionController::Base 
    before_action :authenticate_user! 
end 

#app/controllers/admin/products_controller.rb 
class Admin::ProductsController < Admin::ApplicationController 
    def index 
     @products = Product.all 
    end 
end 

這將爲您提供一個唯一的身份驗證區域來提供接入創造ProductCategory對象。

如果你想路由到這些控制器,你需要使用所提供的命名空間的路線:

<%= link_to "New Product", admin_product_path if user_signed_in? %> 
+0

不幸的是,也沒有工作。我一個字母地複製了你的代碼,嘗試了很小的變化,但總是得到相同的錯誤:在我的控制器中定義的變量沒有定義(因爲方法沒有被達到)並且參數是admin:id => categories這意味着Rails將'/ admin/categories'中的'categories'看作參數而不是路由。另外,我在Mongoid中使用Rails 4。這有什麼區別嗎? – WagnerMatosUK 2014-08-30 16:28:23

相關問題