0

コードのリファクタリングを学んでいますが、自分のアプリケーションにある sessions_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

まず、他のアクションで再利用される可能性があるため、管理者ルックアップを抽出できます。

また、フラッシュ キーを標準化することもできます。noticealertは、理解できる 2 つの標準キーです#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 に答える