我想設置的東西,只允許用戶在某些情況下去某些網址。現在,我有一個setEvent/:id
網址,它將用戶屬性設置爲event_id
,然後將用戶重定向到event
網址。用戶可以訪問像.../whatever/event/1
這樣的url,其中1
需要等於event_id
,如果不是,則會重定向用戶。紅寶石 - 允許/限制網址訪問
但是,這不會阻止某人僅僅在地址欄中輸入.../whatever/setEvent/:id
以訪問該頁面。
我想設置的東西,只允許用戶在某些情況下去某些網址。現在,我有一個setEvent/:id
網址,它將用戶屬性設置爲event_id
,然後將用戶重定向到event
網址。用戶可以訪問像.../whatever/event/1
這樣的url,其中1
需要等於event_id
,如果不是,則會重定向用戶。紅寶石 - 允許/限制網址訪問
但是,這不會阻止某人僅僅在地址欄中輸入.../whatever/setEvent/:id
以訪問該頁面。
沒有帶來更多的寶石,你可以做一個before_action
before_action :enforce_tenancy, except: [:index]
before_action :allow_only_admin, only: [:index]
private
def enforce_tenancy
render unauthorized unless event.user_id == current_user.id
end
def allow_only_admin
render no_way_sucka_path unless current_user.admin?
end
請參閱我對原始問題的評論。 –
如果將before操作設置爲強制執行所提及的操作的邏輯,則使用此操作將起作用。 – Austio
我也有類似的問題,這可能不是最好的方式來處理,但在該頁面的動作,你可以查看當前並檢查該屬性,然後重定向到他們可以訪問的一個,如果他們去一個不正確的網址。
東西有點像:
url_id = request.fullpath.sub('/whatever/event/', '')
redirect_to user_page_path(user.id) unless (current_user.event_id.to_s == url_id)
很抱歉,如果代碼是不是太好了,我試圖根據關你給的信息來寫。
編輯*確保在從數據庫獲取頁面的任何信息之前執行此操作,否則效率會降低。
執行此操作的正確方法是在控制器中執行before操作。以下是我的一個應用程序示例,其中未登錄的用戶將始終被重定向到new_session網址。
class ApplicationController < ActionController::Base
helper_method :current_user, :logged_in?, :herd_user
def herd_user
redirect_to new_session_url unless logged_in?
end
... other medthods...
end
和
class StaticPagesController < ApplicationController
before_action :herd_user
def index
end
end
如果他們已登錄並轉到他們不應允許訪問的網址,該怎麼辦? –
該URL將使他們獲得特定的控制器操作。在該方法中,檢查當前用戶的組成員資格並根據需要重定向。 – zach
看看cancancan寶石 – alexsmn
或只是測試,看看是否發出請求的用戶是創建的事件(如果您存儲在事件表中USER_ID的一個,或者在這兩個實體之間有多對多關係)。 – alexsmn
事件都是由管理員創建的,他們只是在特定時間向用戶顯示。 'setEvent'方法只是設置用戶看到的事件,所以我不能檢查用戶是否創建了事件。 –