Saturday, July 16, 2016

Action Mailer with Devise and Gmail





https://launchschool.com/blog/handling-emails-in-rails
https://sendgrid.com/docs/Integrate/Frameworks/rubyonrails.html

[] create mailer mailers/user_notifier_mailer.rb add lines

class UserNotifierMailer < Devise::Mailer default :from => 'pseudoreza@gmail.com' # send a signup email to the user, pass in the user object that contains the user's email address def send_signup_email(user) @user = user mail( :to => @user.email, :subject => 'Thanks for signing up for our amazing app' ) end end


[] edit /config/environments/development.rb add lines

config.action_mailer.delivery_method = :smtp # SMTP settings for gmail config.action_mailer.smtp_settings = { :address => "smtp.gmail.com", :port => 587, :user_name => ENV['gmail_username'], :password => ENV['gmail_password'], :authentication => "plain", :enable_starttls_auto => true }

[] edit /config/environments/production.rb add lines
config.action_mailer.delivery_method = :smtp # SMTP settings for gmail config.action_mailer.smtp_settings = { :address => "smtp.gmail.com", :port => 587, :user_name => ENV['gmail_username'], :password => ENV['gmail_password'], :authentication => "plain", :enable_starttls_auto => true }

[] create controller registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController def create # Create the user from params @user = User.new sign_up_params if @user.save # Deliver the signup email UserNotifierMailer.send_signup_email(@user).deliver redirect_to(new_user_session_path, :notice => 'User created') else render :action => 'new' end end end

[] edit config/initilizers/devise.rb add line
config.mailer = 'UserNotifierMailer'

[] modify routes.rb
devise_for :users, path_names: {sign_in: "login", sign_out: "logout"}, controllers: { registrations: 'registrations' }




Video

Pagination using Kaminari

Kaminari

click here to visit kaminari github repository.

[01] add kaminari gem
       gem 'kaminari' 

[02] edit articles_controller.rb modify line
       def index
         @articles = Article.all.page(params[:page]).per(5)
       end

[03] edit views/artciles/index.html.erb add line
       <%= paginate @articles %>


change look

[04] edit config/locales/en.yml add lines
        views:

          pagination:
            previous: "&lt&lt"
            next: "&gt&gt"
            first: "First"
            last: "Last"
            truncate: "..."

[05] add kaminari theme // github
       $rails g kaminari:views default

Video

Friday, July 15, 2016

Rails authentication using Devise

Devise


devise gem github url: https://github.com/plataformatec/devise

[01] add devise gem
       gem 'devise'

[02] install gem 
       $bundle install

[03] run generator
       $rails generate devise:install

[04] generate model
       $rails generate devise User
       $rails db:migrate


[05] edit config/environments/development.rb add line
       config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

[06] edit app/views/layouts/application.html.erb add lines
       <div id=user_nav>
          <% if user_signed_in? %>
            <p> Logged in as <strong><%= current_user.email %></strong>. </p>
            <%= link_to "Edit Profile", edit_user_registration_path %> |
            <%= link_to "Logout", destroy_user_session_path, method: :delete %>
          <% else %>
            <%= link_to "Sign up", new_user_registration_path %> |
            <%= link_to "Login", new_user_session_path %>
          <% end %>             
        </div>
        <% flash.each do |name, msg| %>
          <%= content_tag :div, msg, id: "flash_#{name}" %>
      <% end %>


[07] copy Devise views
       $rails g devise:views


Customize Sign_in to Login

[08] edit config/locales/devise.en.yml edit lines
       signed_in: "Logged in successfully."
       signed_out: "Logged out successfully." 

       already_signed_out: "Logged out successfully."
       
[09] edit views/devise/sessions/new.html.erb

[10] edit routes.rb
       devise_for :users, path_names: {sign_in: "login", sign_out: "logout"} 

Login as username

[11] add username column in users table
       $rails g migration add_username_to_users username 
       $rails db:migrate

[12] edit views/devise/sessions/new.html.erb
       <div class="field">
         <%= f.label :username %><br />
         <%= f.text_field :username, autofocus: true %>
       </div>


[13] edit config/initilizers/devise.rb 
       config.authentication_keys = [:username]
       config.case_insensitive_keys = [:username]
       config.strip_whitespace_keys = [:username]

 [14] edit user.rb add line
       validates_presence_of :username

[15] edit application_controller.rb add lines
       before_action :configure_permitted_parameters, if: :devise_controller?
       
       def configure_permitted_parameters
         devise_parameter_sanitizer.permit(:sign_up) do |user_params|
           user_params.permit({ roles: [] }, :email, :username, :password, :password_confirmation)
         end
       end
 

restrict article content

[16] edit articles_controller.rb add line
       before_action :authenticate_user!, except: [:index, :show]

      *** before_action is a new syntax for before_filter

 

 

Video Resources