Ruby on rails:整个应用程序的上一个url助手



有没有一种简单的方法可以编写一个助手方法来始终更新会话中以前访问过的url。我尝试了下面的方法,但保存的url始终是当前的。我希望能够在我的所有控制器中使用这个助手进行重定向。

#application_controller.rb
class ApplicationController < ActionController::Base
before_filter :my_previous_url
def my_previous_url
    session[:previous_url] = request.referrer
  end
helper_method :my_previous_url
end

我在用户控制器的更新方法中使用了它,如下所示,但它总是重定向到同一个打开的url(看起来有点像刷新被点击了)。

def update
    if current_user.admin == true and @user.update(user_params)
      redirect_to my_previous_url, notice: "Password for User #{@user.username} has Successfully been Changed."
      return
    elsif current_user.admin == false and @user.update(user_params)
      session[:user_id] = nil
      redirect_to login_path, notice: "Password for User #{@user.username} has Successfully been Changed. Please Log-In Using the New Password."
      return
    end
    respond_to do |format|
      if @user.update(user_params)
    changed = true
        format.html { redirect_to logout_path }
        format.json { render :show, status: :ok, location: @user }
      else
        format.html { render :edit }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

request.referer不是您想要的,因为它将在页面重定向上设置,从而丢失您原来的页面。我认为您有一个隐含的要求,即它应该返回上次访问的url,该url与当前url不同,是这样吗?此外,我认为您只想为GET请求设置它,否则您可能会将人员发送回错误的url,因为他们将与GET请求一起发送回。我假设这个previous_url的目的是给人们一个"后台"链接。

此外,不要将设置previous_url的方法与再次读取的方法混淆。

我会这样做:

#application_controller.rb
class ApplicationController < ActionController::Base
  before_filter :set_previous_url
  helper_method :previous_url
  def set_previous_url
    if request.method == :get && session[:previous_url] != session[:current_url]
      session[:previous_url] == session[:current_url]
      session[:current_url] = request.url          
    end 
  end
  def previous_url
    session[:previous_url]
  end
end

最新更新