Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 重定向到特定页面,而不是:未确认用户登录时注意_Ruby On Rails_Ruby_Devise - Fatal编程技术网

Ruby on rails 重定向到特定页面,而不是:未确认用户登录时注意

Ruby on rails 重定向到特定页面,而不是:未确认用户登录时注意,ruby-on-rails,ruby,devise,Ruby On Rails,Ruby,Devise,如何将登录时未确认的用户重定向到某个页面,而不是显示:通知(“您必须确认您的帐户”)。使用Desive gem(最新版本) 此问题:()提供了以下解决方案: # config/initializers/my_strategy.rb Warden::Strategies.add(:my_strategy) do def valid? true end def authenticate! u = User.find_for_authentication(:ema

如何将登录时未确认的用户重定向到某个页面,而不是显示:通知(“您必须确认您的帐户”)。使用Desive gem(最新版本)

此问题:()提供了以下解决方案:

# config/initializers/my_strategy.rb
Warden::Strategies.add(:my_strategy) do 
  def valid? 
    true
  end 

  def authenticate! 
    u = User.find_for_authentication(:email => params[:email])
    if u.nil? || !u.valid_password?(params[:password])
      fail(:invalid)
    elsif !u.confirmed?
      fail!("Account needs confirmation.")
      redirect!("your_root_url")
    end
  else
    success!(u)
  end    
end

#config/initializers/devise.rb
config.warden do |manager|  
  manager.default_strategies(:scope => :user).unshift :my_strategy
end

这不起作用。

在我的微调应用程序中,我很幸运地覆盖了designe的控制器,通常是designe会话控制器

例如:

class SessionsController < Devise::SessionsController

  def create
    #overriding Devise's create controller first
    super

    #check if current user is inactive
    @user = user_from_current_user
    unless @user.active?
      redirect("your_root_url")
    end
  end

end
class sessioncontroller

HTH

生成您自己的会话控制器,以使用
rails g控制器会话覆盖Desive的默认会话控制器(此控制器的名称无关紧要,您可以自己选择)

编辑
config/routes.rb

devise_for :users, :controllers => {:sessions => "sessions"}
class SessionsController < Devise::SessionsController
  def create
    @user = User.find_by_email(params[:user][:email])
    if !@user or @user.confirmed?
      super
    else
      redirect_to YOUR_DESIRED_path
    end
  end 
end
编辑
app/controllers/sessions\u controller.rb

devise_for :users, :controllers => {:sessions => "sessions"}
class SessionsController < Devise::SessionsController
  def create
    @user = User.find_by_email(params[:user][:email])
    if !@user or @user.confirmed?
      super
    else
      redirect_to YOUR_DESIRED_path
    end
  end 
end
class sessioncontroller
我修复了它,如下面的示例所示 但是我想知道是否可以在这个方法中传递用户对象(用户名),这样我就可以重定向到/确认/使用designe User model User.username或User.login..

  config.warden do |manager|
    manager.failure_app = CustomFailure
  end

  class CustomFailure < Devise::FailureApp
    def redirect_url
        if warden_message == :unconfirmed
          "/confirm"
        else
          super
        end
      end
config.warden do | manager|
manager.failure\u app=CustomFailure
结束
类CustomFailure
可能重复@gg_s:我使用最新的Desive indeedThanks分享这个建议,很遗憾,它在2.2.2和rails 3.11上没有发送工作,我仍然只收到flash消息,没有重定向到自定义路径,甚至没有重定向到“/确认”我想我忘了提到routes.rb需要通知此更改。很抱歉。我相信@Brian提供了一个更好的答案。这似乎合乎逻辑,但行不通。Warden在这个控制器方法被点击之前负责验证,你可以在某种程度上捕捉到它。我非常确定这是有效的,因为我刚刚创建了一个全新的rails应用程序来测试这个代码,然后再回答。由于此控制器覆盖Desive的默认会话控制器,用户单击“登录”后将立即调用此自定义的
create
方法。因此,这里的逻辑应该运行良好。请试一试,如果你得到任何错误信息,请告诉我。嗨,Rubytastic,如果你想与用户对象交互,我相信我的解决方案确实有效,是一个不错的选择。你试过了吗?@Brian Hi,是的,我在我的应用程序中试过了,它没有给出预期的行为,所以我现在使用我的warden auth方法恢复。你能告诉我你使用我的解决方案时得到的错误消息吗?我想知道为什么它能在我的机器上工作,而在你的机器上工作:)它就是不工作它抛出默认通知,你的代码真的不工作抱歉,检测用户是否启用的过程在创建控制器之前处理。真正使用warden策略是唯一的方法,因为它会在自定义创建代码之前挂起并重定向用户(创建方法仅在Desive用户登录后触发,未确认的用户永远不会出现。因此,尽管逻辑正确,但不会触发:)您可以查看Desive的源代码:如您所见,在第2行,在调用
create
:require\u no\u authentication
)之前,源代码不会进行身份验证,而是在
create
方法中进行身份验证(在第15行)。如果用户被确认,我将调用原始方法(
super
)。否则,我将重定向用户。无论如何,根据源代码,我相信我的代码应该可以工作。我猜您还有其他与我的代码冲突的地方:(。