设计 - 如何触发页面上的sign_in用户已有权访问

时间:2017-06-08 18:31:38

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

我正在使用Devise 3.5.2。我有一个Item模型,其中包含任何人都可以访问的展示操作(before_filter :authenticate_user!, except: :show)。在显示页面上,我有一个按钮,使用jquery触发文件上传对话框。

我只希望此上传对话框适用于已登录的用户。如果用户注销并单击按钮,我希望它将它们带到我的登录页面。当他们登录时,我希望它将他们带回到显示页面。

如何点击此链接将它们带到登录页面,然后登录后,它们会被重定向到他们刚刚访问的页面并且已经有权访问?

<% unless current_user %>
  <%= link_to "Upload image", item_path @item, class: "btn btn-lg btn-success" %>
<% end %>

这不会起作用,因为他们已经可以访问此页面。

编辑:我在此尝试点击此链接https://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-on-successful-sign-in,但它似乎无法正常运作。

我的会话控制器看起来像这样。也许我的create方法导致了冲突?

class SessionsController < Devise::SessionsController

   def new
     self.resource = resource_class.new(sign_in_params)
     store_location_for(resource, params[:redirect_to])
     super
   end  


  def create
    self.resource = warden.authenticate!(auth_options)
    if resource.deactivated?
      set_flash_message(:notice, :reactivated) if is_flashing_format?
      resource.reactivate
    end
    sign_in(resource_name, resource)
    yield resource if block_given?
    respond_with resource, location: after_sign_in_path_for(resource)
  end  
end

2 个答案:

答案 0 :(得分:1)

听起来你需要一些特定于控制器的代码。

当用户点击该链接时,请执行相应的操作:

    def image_action # Whatever the action name is
      if current_user # current user is given to you by devise
        # Do stuff that a logged in user would do
      else
        # redirect to login page
      end
    end

您的想法是将逻辑排除在视图之外,而是让控制器为登录用户提供相应的数据/页面,或者让未经身份验证的用户重定向到登录页面。

current_user是设计给你的一个方法,它评估当前登录的用户发出请求,或者nil如果用户没有登录。

如果你发布你的控制器代码,我会提交更多我的示例代码,我只是不想让它太具体而容易引起混淆。

答案 1 :(得分:0)

由于您已经在控制器中使用before_action :authenticate_user!来验证logged_in用户..您只需要覆盖该方法即可重定向到您喜欢的任何页面。

application_controller.rb

def authenticate_user!
  if user_signed_in?
    super
  else
    redirect_to whatever_path
  end
end