ajax调用后request.url不正确?

时间:2014-06-29 12:34:05

标签: ruby-on-rails ruby-on-rails-3 session authentication login

我使用登录页面登录我的Rails应用程序,该登录页面可以直接通过使用该路径的登录链接到达

match 'ladmin/login' => 'ladmin#login'

或者如果我尝试编辑内容 在任何一种情况下,我都会进入登录页面,这允许我登录,然后将我返回到我尝试使用的页面或应用程序索引页面,但现在作为登录用户。

大部分时间这完全没问题,我登录并返回到我的内容编辑页面或链接索引页面(如果我刚刚使用'登录'链接iself)。

但是我已经能够找到一个错误

如果我使用我的任何ajax链接,request.url会被错误地记住

(切换组阴影或切换摘要/详细信息,然后下次尝试登录(即使我几次点击)(假设我最初退出)会导致空白页面 - 尽管我现在实际上是登录。有趣的是我注意到,当发生这种情况时,我在浏览器地址栏中结束的网址总是localhost:3000/toggle_row_shading,这似乎是问题的线索 - 似乎记住了request.url不正确。

require digest/sha1用于在用户模型中进行身份验证,并使用各种身份验证和密码方法。

相关代码似乎在我的LadminController

  def login
    session[:user_id] = nil 
    if request.post?
      user = User.authenticate(params[:username], params[:password])
      if user
        session[:user_id] = user.id
        session[:username] = user.username
        uri = session[:original_uri]
        session[:original_uri] = nil 
        redirect_to(uri || {:action => "index", :controller => :links})
      else
        flash.now[:notice] = "Invalid username/password combination"
      end 
    end 
  end 

我可以暂时解决它

  def login
    session[:user_id] = nil 
    if request.post?
      user = User.authenticate(params[:username], params[:password])
      if user
        session[:user_id] = user.id
        session[:username] = user.username
        redirect_to({:action => "index", :controller => :links})
      else
        flash.now[:notice] = "Invalid username/password combination"
      end 
    end 
  end 

然而,这会'忘记'我来自的网页,例如一个“编辑”链接,只需使用links#index在登录后让我开启,这是不理想的。它确实解决了空白页问题,因为现在重现它的步骤更长时间才能实现。

如何让登录信息返回到预定的编辑页面,而不是给我空白页?

btw我的ajax链接代码是:

%a{href: '#', :data => {toggle_group_row_shading: 'toggle'}}
  click to toggle

我是否需要额外的路线,因为应用程序是从rails 2.3.8开始的?

我的路线包括

match 'toggle_full_details' => 'links#toggle_full_details'
match 'toggle_row_shading' => 'links#toggle_row_shading'
get 'verify_link/:id', to: 'links#verify_link', as: :verify_link
get 'unverify_link/:id', to: 'links#unverify_link', as: :unverify_link

我应该把它们全部都拿出来吗?

我的应用程序控制器包括:

before_filter :authorize, :except => :login

def authorize
  unless User.find_by_id(session[:user_id])
    session[:original_uri] = request.url #request.request_uri
    flash[:notice] = "Please Log In!"
    redirect_to :controller => 'ladmin', :action => 'login'
  end
end

1 个答案:

答案 0 :(得分:1)

我之前遇到过这种情况。我发现的问题是,对于AJAX请求,session[:original_uri]仍然存储并且......很糟糕。基本上,它存储一个uri用于ajax请求,登录后它没有很好地显示。我最终得到的代码是这样的:

if request.get? && !request.xhr?
  session[:original_uri] = request.url
end

这样我们就不会存储在登录后不应重定向的session[:original_uri]内容。您可以在应用中找到其他内容添加到此条件中。例如,我有一些下载链接可以呈现send_file,但这些也不适合存储下次登录。