ben

OMÜ , Bilgisayar Mühendisliği, 13'

10 Eylül 2015 Perşembe

rails-device email or tc or phone sign_in


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ı