2015-08-08 33 views
1

我想設置的東西,只允許用戶在某些情況下去某些網址。現在,我有一個setEvent/:id網址,它將用戶屬性設置爲event_id,然後將用戶重定向到event網址。用戶可以訪問像.../whatever/event/1這樣的url,其中1需要等於event_id,如果不是,則會重定向用戶。紅寶石 - 允許/限制網址訪問

但是,這不會阻止某人僅僅在地址欄中輸入.../whatever/setEvent/:id以訪問該頁面。

+0

看看cancancan寶石 – alexsmn

+0

或只是測試,看看是否發出請求的用戶是創建的事件(如果您存儲在事件表中USER_ID的一個,或者在這兩個實體之間有多對多關係)。 – alexsmn

+0

事件都是由管理員創建的,他們只是在特定時間向用戶顯示。 'setEvent'方法只是設置用戶看到的事件,所以我不能檢查用戶是否創建了事件。 –

回答

0

沒有帶來更多的寶石,你可以做一個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 
+0

請參閱我對原始問題的評論。 –

+0

如果將before操作設置爲強制執行所提及的操作的邏輯,則使用此操作將起作用。 – Austio

0

我也有類似的問題,這可能不是最好的方式來處理,但在該頁面的動作,你可以查看當前並檢查該屬性,然後重定向到他們可以訪問的一個,如果他們去一個不正確的網址。

東西有點像:

url_id = request.fullpath.sub('/whatever/event/', '') 
redirect_to user_page_path(user.id) unless (current_user.event_id.to_s == url_id) 

很抱歉,如果代碼是不是太好了,我試圖根據關你給的信息來寫。

編輯*確保在從數據庫獲取頁面的任何信息之前執行此操作,否則效率會降低。

1

執行此操作的正確方法是在控制器中執行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 
+0

如果他們已登錄並轉到他們不應允許訪問的網址,該怎麼辦? –

+0

該URL將使他們獲得特定的控制器操作。在該方法中,檢查當前用戶的組成員資格並根據需要重定向。 – zach