基于设计认证状态的条件显示

时间:2014-12-19 00:33:30

标签: ruby-on-rails devise

我使用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控制器可以获取该信息?

1 个答案:

答案 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