2016-01-08 5 views
0

Из-за моей вошедшей в систему проверки перед действием при удалении объекта я не могу использовать redirect_back.Ruby on Rails - сохранить текущее Url для перенаправления после уничтожения

Какой из них является лучшим способом сохранить текущий url где-то, вероятно, в session helper, а затем перенаправить на это значение в любом контроллере?

Пожалуйста, помогите, эта проблема затрагивает все мои связанные контроллеры.

Redirect back посылает мне редактировать/показывать, что сейчас равно нулю.

Im в настоящее время удаления от родителя:

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' имеет к этому какое-то отношение. Вы хотите сказать, что если вы удалите эту проверку, вы можете перенаправить CAN? Не могли бы вы показать пример кода? – SteveTurczyn

+0

Проверка logged_in хранит текущий URL-адрес, то же самое с правами доступа, поэтому перенаправление обратно отправляет меня на путь show/edit, мне нужно перенаправить 2 шага назад в этом случае. Redirect_back или redirect_to назад имеют одинаковый эффект, и они работают с хорошей аутентификацией whit. Поэтому мне действительно нужно дополнительное место хранения пути или узнать, как настроить перенаправление на 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 

, конечно же, вы можете установить и return from any point, я использую его, чтобы позволить пользователю перемещаться по подразделу сайта, а затем выходить из него, записывая ссылку на активность, когда вы делаете действие show в подраздел, и отображаете кнопки на пути session'd, чтобы получить в точке выхода они присоединились в любой момент.

Вы должны добавить несколько тестов для его установки, если вы не установите его, конечно, если вы используете ссылку.

+0

Спасибо, я попробую второй вариант. Я использую полиморфные таблицы, не уверен, что можно использовать первый вариант, могу ли я изменить/использовать .parent полиморфным? –

+0

извините. .parent был примером класса. пожалуйста, вставьте свой собственный метод - обычно для полиморфных я ставлю own_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

 Смежные вопросы

  • Нет связанных вопросов^_^