检查Rails Devise中的sign_in状态而不重定向

时间:2014-02-23 22:09:06

标签: ruby-on-rails ruby-on-rails-3 authentication ruby-on-rails-4 devise

我正在尝试根据登录状态创建一个行为不同的页面。 例如,如果用户尝试导航到另一个页面,则应该打开一个要求注册的对话框,而如果用户已经登录,则他/她将只是浏览而没有问题。

我试图使用这样的东西:

<% if current_user %>
  <%= link_to @post %>
<% else %>
  <a href = '#' id = 'registration_modal'><a>
<% end %>

当jQuery处理程序在单击$("registration_modal")时打开一个模态时。

但是为了做到这一点,我需要在控制器内调用authenticate_user!。但是,如果我这样做,它只会将用户重定向到登录页面而不是首先呈现此页面。

我想知道是否有一种简单的方法来处理这种情况。谢谢!

1 个答案:

答案 0 :(得分:1)

正如我们在上面的评论中所讨论的,解决方案是不在控制器上调用authenticate_user!,该控制器显示您在问题中粘贴了代码的视图。然后,用户将不会立即重定向到登录页面。无论您是否在控制器中调用current_useruser_signed_in?authenticate_user!都会有效,因此该视图可以正常运行。相反,您可以在authenticate_user!转到的控制器上调用link_to @post,以确保 控制器在登录后受到保护。

如果您只想确保控制器中的某些操作需要登录,则始终可以使用标准:except:only参数作为过滤器。例如:

before_filter authenticate_user!, :except => [:an_action, :another_one]

在这种情况下我更喜欢:except:only,因为它有效地将不需要身份验证的方法列入白名单,因此您添加的任何新方法都需要身份验证,除非将它们添加到列表中,而:only意味着新方法不需要身份验证,除非您将它们添加到列表中。所以:except默认更安全,这总是好的!在这个主题上,如果您希望在应用程序中默认安全,可以进一步向before_filter authenticate_user!添加ApplicationController,然后在您的子控制器中不需要身份验证的地方,可以使用skip_before_filter :authenticate_user!, :only => [:an_action, :another_one]。如果正在使用Rails 4,则为before_actionskip_before_action