[英]Ruby On Rails - Devise - sessions_controller : undefined 'build_resource'
[英]Refactoring sessions_controller in Ruby On Rails
我正在學習重構代碼,但在重構應用程序中的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])
從這種方法,但這將是最好的方法嗎?如果我提取了這個,我將放在哪里?
首先,您可以提取管理員查詢,因為它可以在其他操作中重復使用。
另外,您可以標准化閃存鍵: 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
如果未找到admin,則必須使用#where
而不是#find_by
以避免異常。
如果要保留當前的閃存鍵,可以添加一個初始化器:
ActionController::Flash.add_flash_types( :success, :error )
在路徑#redirect_to
從#find_admin
當認證失敗或許應該指出登錄網址。
嘗試這個
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.