2013-05-06 96 views
1

我有一個自定義路線設置中,將URL中的LOCATION_ID(見下文)Rails的康康舞 - 如何限制用戶訪問自定義URL路由

resources :menu_items, :path => "/location_menu/:location_id" 

所以,當我打/location_menu/1它會告訴我LOCATION_1菜單,/location_menu/2將顯示location_2的菜單等

每個用戶關聯到多個位置(has_many :locations

我試圖用康康舞從查看某些MENU_ITEM URLS限制用戶。

例如:用戶1與位置1相關聯和2因此,他們只能查看頁面/location_menu/1/location_menu/2。但他們無法查看/location_menu/3

我在控制器創建自定義方式作爲的before_filter:

before_filter :location_check 
... 
def location_check 
    @location = Location.find(params[:location_id]) 
    authorize! :see_location, @location 
end 

在我ability.rb

can :see_location, MenuItem do |location| location && user.location_ids.include?(location.id) end 

出於某種原因,這並不爲我工作。我可能做錯了什麼?如果你們能幫助我,我會非常感激!

謝謝。

+0

做'user'和'location'是之間的關聯'has_many_through' – Viren 2013-08-01 09:57:23

回答

0

首先,我沒有看到定義自定義路由而不是嵌套資源會帶來哪些好處,但它看起來像是誇大了您的域語言,並導致可能引用任何特定資源的情況幾個不同的名字 - 這可能會讓人感到困惑,所以現在簡化它是值得的。

在你location_check方法,您是在Location實例授權see_location,但你已經證明我們的Ability類的部分涉及MenuItem類。嘗試定義你這樣的能力:

can :see_location, Location, id: user.location_ids 

編輯

如果你需要一個康康舞行動直接授權MenuItems,試試這個(假設MenuItem一個belongs_to :location關係):

can :view, MenuItem, location_id: user.location_ids 

至於你的路線,想想更簡單。所有你需要的是這樣的:

resources :location_menus 

...然後與此相關的一切都在LocationMenusController。不要擔心沒有同名的模型 - 您仍然可以使用Location.find(params[:id])查找您的位置。據我所知,關於位置菜單頁面的所有內容都取決於當前用戶對特定位置的訪問權限,因此您可以將LocationMenu視爲一種圍繞Location的虛擬資源。

+0

嘿,這完全是有道理的。但是,我不是授權位置,而是根據他們的location_ids授權MenuItem。 – Rahul 2013-05-06 17:08:54

+0

因此,對於路線,你是否在想這樣的事情? '資源:位置做 集合做 範圍路徑: 「:ID」 做 資源:menu_item_locations 結束 結束 end' 這樣的網址是/位置/ 1/MENU_ITEM /:ID。你如何鎖定一個位置和menu_item id在同一時間? – Rahul 2013-05-06 17:14:05

+0

我已更新回答 - 是否更清晰? – 2013-05-06 17:37:16

1

在能力範圍內檢查一次。RB,

user.location_ids.each do |l| 
    can :view, MenuItem, location_id: l 
end