Devise modelilyle giriş yapıldığında default olarak email girişi ister. Bu giriş alanlarını değiştirebiliriz. Daha önceki yaptığımız devise projesininin üzerinden çalışalım.
Öncelikle devise modelimize uniq alanlar ekleyelim
terminal
$ rails generate migration add_tc_to_users tc:string:uniq
$ rails generate migration add_phone_to_users phone:string:uniq
$ rake db:migrate
Aşağıdaki dosyalara gerekli alanları ekleyelim
controller/application_controller.rb
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:tc,:phone, :email, :password, :password_confirmation, :remember_me,) }
devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:login,:tc,:phone, :username, :email, :password, :remember_me) }
devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:tc,:phone, :email, :password, :password_confirmation, :current_password) }
end
model/user.rb
projemizde omniouth olduğu için bu şekilde düzenliyorum:
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:omniauthable, :omniauth_providers => [:facebook,:twitter,:google_oauth2] ,:authentication_keys => {email: false, login: true}
omniouth girişi yoksa aşağıdaki şekilde
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:authentication_keys => {email: false, login: true}
attr_accessor :login
model içerisinde validasyonlar:
validates :tc, presence: true
validates :phone, presence: true
validates :password, presence: true, on: :create
validates_uniqueness_of :tc, :email,:phone
validates :tc, length: { is: 11 }
validates :phone, length: { is: 11 }
validates :tc, numericality: true
validates :phone, numericality: true
def self.find_for_database_authentication(warden_conditions)
conditions = warden_conditions.dup
if login = conditions.delete(:login)
where(conditions.to_h).where(["lower(tc) = :value OR lower(email) = :value OR lower(phone) = :value", { :value => login.downcase }]).first
else
where(conditions.to_h).first
end
end
views/session/new.html.erb
sil
<p><%= f.label :email %><br />
<%= f.email_field :email %></p>
ekle
<p><%= f.label :login %><br />
<%= f.text_field :login %></p>
view/registrations/new.html.erb
<p><%= f.label :tc %><br />
<%= f.text_field :tc %></p>
<p><%= f.label :phone %><br />
<%= f.text_field :phone %></p>
<p><%= f.label :email %><br />
<%= f.email_field :email %></p>
controller/session_controller.html.erb
projemizde sisteme Aktif olanlar girebiliyordu , bu alanı bu yüzden bu şekilde düzenledik :)
def create
if current_user!=nil
if(current_user.Aktif==true)
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?
respond_with resource, location: after_sign_in_path_for(resource)
else
redirect_to new_user_session_path, error: "Hesabınız Aktif Değil"
end
else
redirect_to new_user_registration_path
end
end
kayıt olalım:
Tc ile giriş:
Telefon ile giriş:
Girişlerimiz başarılı