2016-01-08 47 views
0

由於在操作之前登錄了檢查,所以在刪除對象時,我無法使用redirect_backRuby on Rails - 存儲當前Url以在銷燬後重定向

哪一個是最好的方式來存儲當前url某處,可能在session helper,然後重定向到任何控制器中的值?

請幫忙,這個問題正在影響我所有關聯的控制器。

重定向返回給我編輯/顯示,這是零現在。

即時通訊目前從父刪除:

module SessionsHelper 

    # Logs in the given user. 
    def log_in(user) 
    session[:user_id] = user.id 
    end 

    # Remembers a user in a persistent session. 
    def remember(user) 
    user.remember 
    cookies.permanent.signed[:user_id] = user.id 
    cookies.permanent[:remember_token] = user.remember_token 
    end 

    # Returns the current logged-in user (if any). 
    def current_user 
    @current_user ||= User.find_by(id: session[:user_id]) 
    end 

    # Returns true if the user is logged in, false otherwise. 
    def logged_in? 
    !current_user.nil? 
    end 

# Forgets a persistent session. 
    def forget(user) 
    user.forget 
    cookies.delete(:user_id) 
    cookies.delete(:remember_token) 
    end 

    # Logs out the current user. 
    def log_out 
    forget(current_user) 
    session.delete(:user_id) 
    @logs = Log.create(user_id: current_user.id, role_id: current_user.role_id, action:"Logoff") 
    @current_user = nil 
    end 

# Redirects to stored Location (or to the default) 
def redirect_back_or(default) 
    redirect_to(session[:forwarding_url] || default) 
    session.delete(:forwarding_url) 
end 

def store_location 
    session[:forwarding_url] = request.url if request.get? 
end 

end 





class AddressesController < ApplicationController 
    before_action :logged_in_user 

    def address_params 
     params.require(:address).permit(:id, :no, :street, :suburb, :code, :details, :city_id, :addressable_type, :addressable_id) 
    end 


    def new 
     if Accessrule.find_by(role_id: current_user.role_id, workspace:3).try(:canwrite?) 
     @logs = Log.create(user_id: current_user.id , role_id: current_user.role_id, workspace_id:3, action:"New") 
      @addresses = Address.new(:addressable_type => params[:addressable_type],:addressable_id => params[:addressable_id]) 
     else 
     @logs = Log.create(user_id: current_user.id , role_id: current_user.role_id, workspace_id:3, action:"New !Access Denied! ") 
     flash[:notice] = "You don't have access to create Addresses." 
     redirect_to :back 
     end 
    end 

    def create 
     if Accessrule.find_by(role_id: current_user.role_id, workspace:3).try(:canwrite?) 
     @logs = Log.create(user_id: current_user.id , role_id: current_user.role_id, workspace_id:3, action:"Create", details: address_params) 
      @address = Address.new(address_params) 
      if @address.save 
      flash[:notice] = 'Address Saved' 
      redirect_to @address.addressable 
      else 
      render "new" 
      end 
     else 
     @logs = Log.create(user_id: current_user.id , role_id: current_user.role_id, workspace_id:3, action:"Create !Access Denied! ") 
     flash[:notice] = "You don't have access to create Addresses." 
     redirect_to :back 
     end 
    end 


    def edit 
     if Accessrule.find_by(role_id: current_user.role_id, workspace:3).try(:canupdate?) 
     @logs = Log.create(user_id: current_user.id , role_id: current_user.role_id, workspace_id:3, action:"Edit", details: params[:id]) 
      @addresss = Address.find(params[:id]) 
     else 
     @logs = Log.create(user_id: current_user.id , role_id: current_user.role_id, workspace_id:3, action:"Edit !Access Denied! ", details: params[:id]) 
     flash[:notice] = "You don't have access to edit Addresses." 
     redirect_to :back 
     end 
    end 

    def update 
     if Accessrule.find_by(role_id: current_user.role_id, workspace:3).try(:canupdate?) 
     @logs = Log.create(user_id: current_user.id , role_id: current_user.role_id, workspace_id:3, action:"Update", details: address_params) 
      @addresss = Address.find(params[:id]) 
      if @addresss.update_attributes(address_params) 
      redirect_to @address.addressable 
       flash[:notice] = 'Account Updated' 
      else 
      render "edit" 
      flash[:error] 
      end 
     else 
     flash[:notice] = "You don't have access to edit Addresss." 
     redirect_to back 
     end 
    end 

    def show 
     if Accessrule.find_by(role_id: current_user.role_id, workspace:3).try(:canread?) 
     @logs = Log.create(user_id: current_user.id , role_id: current_user.role_id, workspace_id:3, action:"View", details: params[:id]) 
      @addresses = Address.find(params[:id]) 
     else 
     @logs = Log.create(user_id: current_user.id , role_id: current_user.role_id, workspace_id:3, action:"View !Access Denied! ", details: params[:id]) 
     flash[:notice] = "You don't have access to view Addresss." 
     redirect_to back 
     end 
    end 

    def destroy 
     if Accessrule.find_by(role_id: current_user.role_id, workspace:3).try(:candelete?) 
      @address = Address.find(params[:id]) 
      @logs = Log.create(user_id: current_user.id , role_id: current_user.role_id, workspace_id:3, action:"Delete", details: params[:id]) 
      @address.destroy 
      redirect_to :back 
      flash[:notice] = 'Address Deleted' 
     else 
     flash[:notice] = "You don't have access to delete Addresss." 
     redirect_to :back 
     end 
    end 


    # Before Filters 

    # Confirms if User is logged-in 
    def logged_in_user 
    unless logged_in? 
    flash[:danger] = "Please log in." 
    redirect_to root_path 
    end 
    end 
end 
+0

我覺得你不能做'redirect_to:back',因爲前面的視圖是被刪除對象的'show'頁面?我看不出爲什麼你的'logged_in'檢查與它有任何關係。你是否說如果你刪除了可以重定向的檢查?你能展示一些示例代碼嗎? – SteveTurczyn

+0

logged_in檢查存儲當前URL,與訪問權限相同,因此重定向返回將我發送到顯示/編輯路徑,在這種情況下,我需要重新定向2個步驟。 redirect_back或redirect_to都具有相同的效果,並且它們正在運行良好的惠普身份驗證。所以我真的需要一個輔助路徑存儲位置或學習如何設置一個重定向到2個步驟 –

回答

0

我只儲存在那裏我想去的地點,就在我提交刪除:

def destroy 
    @child = Child.find_by params[:id] 
    parent = @child.parent # or whatever 
    @child.destroy 
    flash[:notice] = 'Deleted' 
    redirect_to parent 
end 

如果你想在一個存儲會議,我不使用摧毀,但做其他事情:

def destroy 
    @child = Child.find_by params[:id] 
    session[:return_link] = parent_path(@child.parent) # or whatever 
    @child.destroy 
    flash[:notice] = 'Deleted' 
    redirect_to session[:return_link] 
end 

當然,你可以然後設置和從任何點返回,我使用它來允許用戶瀏覽網站的一個小節,然後退出,通過在執行小節操作時記錄活動引用者,並將按鈕顯示到會話路徑中獲得在任何時候他們都在出口處加入。

你必須爲它設置添加一些測試,如果你沒有設置它,當然你應該使用鏈接。

+0

謝謝,我會嘗試第二個選項。我使用多態表,不知道是否可以使用第一個選項,我可以通過多態來更改/使用.parent嗎? –

+0

對不起。 .parent是一個示例類。請插入你自己的方法 - 通常爲多態我把belongs_to放在你定義的基類中,然後所有的子類都有屬於。然後使用任何belongs_to是..這假定所有的多態類belongs_to一個特定類型的對象,如果不是,爲每種類型定義一個get_parent方法,它返回父(或您想要的對象的路徑得到..) – Tim

1

您可以存儲多個redirect_to的路徑...最好使用單獨的before_action要做到這一點,在你的ApplicationController

before_action :store_back_paths 

def store_back_paths 

    # if session[:back_path] doesn't exist, create it as an empty array 

    session[:back_path] ||= [] 

    # add the current path as a new entry in the array 

    session[:back_path] << request.referer 

    # while there are more than five entries, drop the oldest entries 
    # this is to ensure we're not storing too many entries 

    session[:back_path].shift while session[:back_path].count > 5 
end 

在做一個正常的重定向,使用彈出從而消除了最後一個元素數組中和返回刪除的值。

redirect_to session[:back_path].pop 

在做一個重定向後,摧毀下降的最後一個條目(指向該頁面顯示爲被破壞的項目),然後重定向到路徑在這之前。

session[:back_path].pop # drops the last entry 
redirect_to session[:back_path].pop 
+1

這很好,我正在考慮這樣的事情,最後3次存儲,但我缺乏知識限制了我。我已經添加了代碼,所以如果你有一些時間來更好地解釋我會永遠感謝 –

+0

好的,我已經將它重新編寫成更多可用的代碼並添加更多解釋。 – SteveTurczyn