0

我正在学习重构我的代码,但我在重构我的应用程序中的 session_controller 时遇到了麻烦。它违反了“告诉不要问”原则。我正在考虑将一些逻辑提取到它自己的类中,但不确定如何会工作。这是控制器的代码。

class SessionsController < ApplicationController
  def create
    admin = Admin.find_by(email: params[:sessions][:email]) 
    if admin && admin.authenticate(params[:sessions][:password])
      sign_in admin
      redirect_to anasayfa_path
      flash[:success] = 'Başarılı şekilde giriş yapıldı'
    else
      redirect_to root_path
      flash[:error] = 'Giriş bilgilerinde bir hata var'
    end
  end
end

我将如何重构这个?我想提取

admin && admin.authenticate(params[:sessions][:password])

从这个方法,但那是最好的方法吗?如果我提取这个,我会把类放在哪里?

4

2 回答 2

1

首先,您可以提取管理员查找,因为它可以在其他操作中重用。

此外,您可以标准化您的闪存键:notice并且alert是两个可以#redirect_to理解的标准键。

class SessionsController < ApplicationController
  before_filter :find_admin

  def create
    if @admin.authenticate(params[:sessions][:password])
      sign_in @admin
      redirect_to anasayfa_path, notice: 'Başarılı şekilde giriş yapıldı'
    else
      redirect_to root_path, alert: 'Giriş bilgilerinde bir hata var'
    end
  end

  private

  def find_admin
    @admin = Admin.where(email: params[:sessions][:email]).first or redirect_to( root_path, alert: 'not logged in' )
  end
end

如果找不到管理员,您必须使用#where而不是避免异常。#find_by

如果要保留当前的闪存键,可以添加初始化程序:

ActionController::Flash.add_flash_types( :success, :error )

#redirect_to身份验证失败和身份验证失败时的路径#find_admin应该可能指向登录 url。

于 2013-09-27T10:28:59.700 回答
0

尝试这个

class SessionsController < ApplicationController
  def create
    admin = Admin.find_by(email: params[:sessions][:email])
    login_status = false 
    if admin && admin.authenticate(params[:sessions][:password])
      sign_in admin
      login_status = true
    end
    login_status ? redirect_to(anasayfa_path, :flash => {:success => 'Başarılı şekilde giriş yapıldı'}) : redirect_to(root_path, :flash => {:error => 'Giriş bilgilerinde bir hata var'})  
  end
end
于 2013-09-27T10:48:39.450 回答