我使用Devise 3.4.0,Rails 4.1.8。
用户点击sessions#new
后,输入用户名和密码,然后点击"登录"按钮,设计POSTS到/users/sign_in
。如果身份验证成功,则会重定向用户。但是,如果身份验证失败,我需要在视图中做一些不同的事情。基本上,我们有两种类型的帐户:遗产和现代。
现代帐户没有问题:它们来自我们的Rails系统,所以我们知道错误的登录是一个糟糕的登录。他们肯定有一个帐户,他们只是使用了错误的密码。我想在flash消息之外向他们显示其他帮助文本(我也在使用)。
但是,我们已将旧帐户导入我们的系统;我们还没有为他们分配密码。如果他们尝试使用旧版帐户登录,我希望在Flash消息之外显示相同的Flash消息,但不同的帮助文字。
我正在寻找类似的东西(如果逻辑在视图中;坚持我一分钟)。最后看两个条件?
<div class="login_form">
<div class="flash">
<%= render partial: 'layouts/flash_messages', locals: { flash_messages: flash } %>
</div>
<%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
<%= f.email_field :email, autofocus: true, placeholder: "Email" %>
<%= f.password_field :password, placeholder: "Password" %>
<%= f.button "Sign in" %>
<% end %>
<% if gave_wrong_password? %>
<a href="/def456">Reset your password here!</a>
<% elsif no_account_exists? %>
<a href="/abc123">Create a new account here!</a>
<% end %>
</div>
基本上,我需要Devise(或Warden)告诉我为什么有些事情失败了。是否可以使用Devise控制器可以获取该信息?
答案 0 :(得分:1)
你可以做的就是像这样的设计模型。
#app/controllers/users/sessions_controller.rb
class Users::SessionsController < Devise::SessionsController
layout 'users/login'
before_filter :before_signin, :only => [:create]
after_filter :after_signin, :only => [:create]
def new
self.resource = resource_class.new(sign_in_params)
clean_up_passwords(resource)
respond_with(resource, serialize_options(resource))
end
def create
self.resource = warden.authenticate!(auth_options)
#set_flash_message(:notice, :signed_in) if is_flashing_format?
sign_in(resource_name, resource)
yield resource if block_given?
if session[:user_return_to]
respond_with resource, :location => session[:user_return_to]
else
respond_with resource, :location => after_sign_in_path_for(resource)
end
end
private
def after_sign_in_path_for(resource)
users_root_path
end
def after_sign_out_path_for(resource_or_scope)
new_user_session_path
end
def before_signin
# do something
end
def after_signin
# do something
end
end