Thursday, 10 May 2018

PREVIEW AN IMAGE AND VIDEO BEFORE IT IS UPLOADED

Please take a look at the sample JS code below:

<script type="text/javascript">
  function readURL(input) {
    if (input.files && input.files[0]) {
    var reader = new FileReader();

    reader.onload = function (e) {
    $('#blah').attr('src', e.target.result);
    }

    reader.readAsDataURL(input.files[0]);
    }
  }

  $("#imgInp").change(function(){
    readURL(this);
  });
</script>


and the associated HTML:


<div class="field">
    <%= form.label :image %>
    <%= form.file_field :image,  id: "imgInp" %>
    <img id="blah" src="#" alt="your image" style="height: 150px; width: 200px;" />
  </div>


================================================================

Preview Video Before Saving



We can follow :-


Sunday, 6 May 2018

Customers should be able to view the venue on a map

application.html.erb

        <head>
 <title>Wedding Rooms</title>
 <%= stylesheet_link_tag    "application", media: "all", "data-turbolinks-track" => true %>
 <%= javascript_include_tag "application", "data-turbolinks-track" => true %>
 <%= csrf_meta_tags %>
</head>


_form.html.erb :-


<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyAvuPSxdugPS2FJQibo-i78wVZHWgmKemk"
    ></script>
<link href="http://code.jquery.com/ui/1.10.2/themes/smoothness/jquery-ui.css" rel="Stylesheet"></link>
<script src='https://cdn.rawgit.com/pguso/jquery-plugin-circliful/master/js/jquery.circliful.min.js'></script>
<script src="http://code.jquery.com/ui/1.10.2/jquery-ui.js" ></script>

<div class="field">
    <%= f.label :address %><br>
    <%= f.text_field :address,  id: "gmaps-input-address", class: "form-control" %>
    <br>
    <div id="gmaps-canvas"></div>
    <div id="gmaps-error"></div>
    <%= f.hidden_field :latitude, id: "location_latitude" %>
    <%= f.hidden_field :longitude, id: "location_longitude" %>
  </div>

show.htmlerb

                 <% if @product.address.present? %>
<p>
 <strong>Address:</strong>
 <%= @product.address %>
 <div id="map"></div>
</p>
<% else %>
<% end %>


<script type="text/javascript">
setTimeout(function(){
    $(document).ready(function(){
$('.bxslider').bxSlider({
 auto: true,
 autoControls: true,
 stopAutoOnClick: true,
 pager: true,
 slideWidth: 200
});
});
}, 2000);
</script>
<style>
   #map {
    height: 400px;
    width: 100%;
   }
</style>
  <script>
    function initMap() {
    var lat1 = <%= @product.latitude %>;
    var long1 = <%= @product.longitude %>;
      var uluru = {lat: lat1, lng: long1};
      var map = new google.maps.Map(document.getElementById('map'), {
        zoom: 15,
        center: uluru
      });
      var marker = new google.maps.Marker({
        position: uluru,
        map: map
      });
    }
  </script>
  <script async defer
  src="https://maps.googleapis.com/maps/api/js?key=AIzaSyAvuPSxdugPS2FJQibo-i78wVZHWgmKemk&callback=initMap">
  </script>

Migration :-

add_column :products, :latitude, :decimal, {:precision=>10, :scale=>6}
add_column :products, :longitude, :decimal, {:precision=>10, :scale=>6}

Friday, 4 May 2018

Tasks: Need to display mailchimp emails by using API with Pagination


gem 'gibbon'

your_app/config/initializers/gibbon.rb

Gibbon::Request.api_key = "12bfe8bed564a0a4e6b6250baa8f4c51-us14"
Gibbon::Request.timeout = 15
Gibbon::Request.open_timeout = 15
Gibbon::Request.symbolize_keys = true

Gibbon::Request.debug = false

app/controller :-

class HomeController < ApplicationController
  def index
  gibbon = Gibbon::Request.new(api_key: "12bfe8bed564a0a4e6b6250baa8f4c51-us14", debug: true)
  # members = gibbon.lists("5984a13076").members.retrieve
 
  @page = params[:page].present? ? params[:page].to_i : 1
  offset = (@page-1) * 50
  members =  gibbon.lists("5984a13076").members.retrieve(params: {"count": "50", "offset": offset.to_s, "status": "subscribed"})
  @contacts = members.body[:members]
  @total_pages = (members.body[:total_items]/50.0).ceil
  end
end
--------------------------------------------------------------------------------------------------------------------------

Views:-

<div class="row">
            <% @contacts.each do |contact| %>
            <div class="col-sm-3 text-left">
              <a href="mailto:<%= contact[:email_address] %>"><%= contact[:email_address] %></a>
            </div>
            <% end %>
        </div>
        <div class="row pull-right">
            <nav aria-label="Page navigation " >
          <ul class="pagination">
            <% if @page > 1 %>
            <li class="page-item"><a class="page-link" href="/home/index?page=<%=  @page -1%>">Previous</a></li>
            <% end %>
            <% (1..@total_pages).each do |page|%>
            <li class="page-item <%= @page== page ? 'active' : nil %>"><a class="page-link" href="/home/index?page=<%= page %>"><%= page %></a></li>
            <% end %>
            <% if @page < @total_pages%>
            <li class="page-item"><a class="page-link" href="/home/index?page=<%=  @page +1%>">Next</a></li>
            <% end %>
          </ul>
        </nav>
        </div>
-------------------------------------------------------------------------------------

<style type="text/css">
.pull-right{float: right;}
</style>

Wednesday, 13 December 2017

Mobile Rails API with Devise

1. Add column in User table

   rails g migration AddAuthenticationtokenToUsers authentication_token:string

2.  rails generate controller Api/V1/Api

3. User.rb
 
   before_save :ensure_authentication_token
   def ensure_authentication_token
    if authentication_token.blank?
      self.authentication_token = generate_authentication_token
    end
  end

  private
  def generate_authentication_token
 loop do
   token = Devise.friendly_token
   break token unless User.find_by(authentication_token: token)
 end
  end

4.  ApiController

  class Api::V1::ApiController < ApplicationController
  def create
  end

  def destroy
  end
  respond_to :json
helper_method :current_user
def getting_started
end
def current_user
 @current_user ||= User.where(authentication_token: request.headers['User-Token']).first
end
def authenticate_user!
 return render json:{error:'401 Unauthorized!'},status: 401 unless current_user
end
end

5.  application controller with user over
 
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up) do |user|
      user.permit(:email, :password,:password_confirmation, :remember_me)
    end
    devise_parameter_sanitizer.permit(:sign_in) do |user|
      user.permit(:email, :password)
    end
    devise_parameter_sanitizer.permit(:account_update) do |user|
      user.permit(:email, :password,:password_confirmation, :current_password)
    end
  end


routes.rb

namespace :api do
    namespace :v1 do
      devise_scope :user do
        post "/sign_in", :to => 'sessions#create'
        post "/sign_up", :to => 'registrations#create'
        put '/change_password', to: 'registrations#change_password'
        get "/profile", :to => 'registrations#profile'
        post "/update_account", :to => 'registrations#update'
        # delete "/sign_out", :to => 'sessions#destroy'
        # get "/reset_password", :to => 'registrations#reset_password'
        # get "/reset_password_link", :to => 'registrations#reset_password_link'
      end
    end
  end

6. Apipie Doc

  gem 'apipie-rails'

 bundle install
 rails g apipie:install

config/initializers/apipie.rb

Apipie.configure do |config|
  config.translate = false
  config.app_name                = "project_name"
  config.api_base_url            = ""
  config.doc_base_url            = "/apipie"
  # where is your API defined?
  config.api_controllers_matcher = ["#{Rails.root}/app/controllers/*/*/*.rb", "#{Rails.root}/app/controllers/*/*.rb", "#{Rails.root}/app/controllers/*.rb"]
  config.authenticate = Proc.new do
    authenticate_or_request_with_http_basic do |username, password|
      username == "admin" && password == "password"
    end
  end
end



Doc URL:

 https://jee-appy.blogspot.in/2016/03/how-to-make-rest-api-in-rails.html






Saturday, 7 October 2017

Nested form

Question to answer


1. Gem file: 
          gem "nested_form"

 application.js:
         //= require jquery_nested_form


2. Question controller:
         params.require(:question).permit(:question_type, :body, answers_attributes: [:id, :question_id, :body, :_destroy])

3. Question.rb:
        has_many :answers, dependent: :destroy
        accepts_nested_attributes_for :answers, :allow_destroy => true

4. answer.rb:
       belongs_to :question

5. question form: 

     <table id="tasks">
    <%= form.fields_for :answers do |answer_form| %>
      <div class="row">
          <%= answer_form.text_area :body  ,class: "form-control mynewinput1", placeholder: "Question" %>
          <%= answer_form.link_to_remove "Remove", class: "btn btn-danger" %>
      </div>
    <% end %>
  </table>
<p><%= form.link_to_add "Add a Answer", :answers, :data => { :target => "#tasks" } %></p>

Thursday, 7 September 2017

Social login facebook,twitter ..

Gemfile:

gem "oauth"
gem "oauth2"
gem 'omniauth-oauth2'
gem 'omniauth-facebook'
gem 'omniauth-twitter'
gem 'omniauth-google-oauth2'
gem 'omniauth-linkedin'
gem 'omniauth-github'
gem 'omniauth-pinterest'

--------------------------------------------------

Model generate:

 rails g model authentication provider:string uid:string user_id:integer token:text token_expired_at:datetime

--------------------------------------------------

app/model/authentication.rb:

class Authentication < ApplicationRecord
belongs_to :user
def self.from_omniauth(auth)
    authenticate = where(provider: auth['provider'], :uid=>auth['uid']).first_or_initialize
    register_user = User.find_by(email: auth.info.email)
    if authenticate.user
      return authenticate.user
    elsif register_user
      register_user.authentications.create(provider: auth['provider'], :uid=>auth['uid'])
      return register_user
    else
      user = User.new(
        email: auth.info.try(:email),                      
        password: Devise.friendly_token.first(8)
      )
      if user.email.blank?
        user.email=auth.extra.raw_info.id.to_s+"@gmail.com"
      end
      user.save!(:validate => false)
      user.authentications.create(provider: auth['provider'], :uid=>auth['uid'],token: auth["credentials"]["token"])
      return user
   end
  end
end

-------------------------------------------

User.rb

before_create :confirmation_token
has_many :authentications, dependent: :destroy
validates :email, :uniqueness => {:allow_blank => true}

-------------------------------------------

config/intializers/omniauth.rb:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook, "#{ENV['FACEBOOK_APP_ID']}", "#{ENV['FACEBOOK_APP_SERCRET']}", :scope => 'email, user_friends, manage_pages, pages_show_list'
  provider :google_oauth2, "#{ENV['GOOGLE_APP_ID']}", "#{ENV['GOOGLE_APP_SERCRET']}", scope: 'userinfo.profile,youtube,email', provider_ignores_state: true, prompt: :consent
  provider :twitter, "#{ENV['Twitter_APP_ID']}", "#{ENV['Twitter_APP_SERCRET']}"
  provider :linkedin, "#{ENV['Linkedin_APP_ID']}", "#{ENV['Linkedin_APP_SERCRET']}"
  provider :github, "#{ENV['Github_APP_ID']}", "#{ENV['Github_APP_SERCRET']}", :scope => 'email'
  provider :pinterest, "#{ENV['Pinterest_APP_ID']}", "#{ENV['Pinterest_APP_SERCRET']}", :scope => 'read_public,write_public'
end

--------------------------------------------
application.yml:

default:
  DATABASE_ADAPTER: postgresql
  DATABASE_USER: root
  DATABASE_PASSWORD: root
  DATABASE_NAME: go_foot_ball
  DATABASE_HOST: localhost
  DOMAIN: localhost
  FACEBOOK_APP_ID: xxxxxxxxxx
  FACEBOOK_APP_SERCRET: xxxxxxxxxxxxxxxxxxx
  TWITTER_CONSUMER_KEY: xxxxxxxxxxxxxxxxx
  TWITTER_CONSUMER_SECRET: xxxxxxxxxxxxxxxxx
  INSTAGRAM_APP_ID: xxxxxxxxxxxxxxxxxxxxxxxxx
  INSTAGRAM_APP_SERCRET: xxxxxxxxxxxx
  # AWS_ACCESS_KEY_ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  # AWS_SECRET_ACCESS_KEY:xxxxxxxxxxxxxxxxxxxxxxxxxx
  # REGION: 'us-west-2'
  # AWS_BUCKET_NAME: xxxxxxxxxxxx
  # FACEBOOK_APP_VERSION: 'v2.8'

development:
  DATABASE_ADAPTER: postgresql
  DATABASE_USER: root
  DATABASE_PASSWORD: root
  DATABASE_NAME: go_foot_ball
  DATABASE_HOST: localhost
  DOMAIN: localhost
  FACEBOOK_APP_ID: xxxxxxxxxxxx
  FACEBOOK_APP_SERCRET: xxxxxxxxxxxxxxxxx
  TWITTER_CONSUMER_KEY: xxxxxxxxxxxxxxxxxx
  TWITTER_CONSUMER_SECRET: xxxxxxxxxxxxxxxxxx
  INSTAGRAM_APP_ID: xxxxxxxxxxxxxxxxxxxxxxxx
  INSTAGRAM_APP_SERCRET: xxxxxxxxxxxxxxxxxxxxxx

testing:
  DATABASE_ADAPTER: postgresql
  DATABASE_USER: root
  DATABASE_PASSWORD: root
  DATABASE_NAME: go_foot_ball
  DATABASE_HOST: localhost
  DOMAIN: localhost

production:
  DATABASE_ADAPTER: postgresql
  DATABASE_USER: root
  DATABASE_PASSWORD: root
  DATABASE_NAME: go_foot_ball
  DATABASE_HOST: localhost
  DOMAIN: localhost

----------------------------------------------

routes:

  match '/auth/:provider/callback', :to => 'pages#create', via: [:get, :post]
  match '/auth/failure', :to => 'pages#failure', via: [:get, :post]

---------------------------------------------

app/controller/pages_controller.rb:

def create
    user = Authentication.from_omniauth(request.env["omniauth.auth"])
    if user
      flash[:notice] = "Authentication successful."
     sign_in :user, user
     redirect_to root_path
    else
        flash[:notice] = "Authentication Failed."
        redirect_to "/users/sign_up"
    end
  end
  def failure
  end
  

Friday, 1 September 2017

How To: Add :confirmable to Users

Modifying the User Model

First, add devise :confirmable to your models/user.rb file

devise :registerable, :confirmable

Create a New Migration

Then, do the migration as:

rails g migration add_confirmable_to_devise

Will generate db/migrate/YYYYMMDDxxx_add_confirmable_to_devise.rb. Add the following to it in order to do the migration.

class AddConfirmableToDevise < ActiveRecord::Migration
  # Note: You can't use change, as User.update_all will fail in the down migration
  def up
    add_column :users, :confirmation_token, :string
    add_column :users, :confirmed_at, :datetime
    add_column :users, :confirmation_sent_at, :datetime
    # add_column :users, :unconfirmed_email, :string # Only if using reconfirmable
    add_index :users, :confirmation_token, unique: true
    User.all.update_all confirmed_at: DateTime.now
  end

  def down
    remove_columns :users, :confirmation_token, :confirmed_at, :confirmation_sent_at
  end
end
You can also generate the corresponding Devise views if they have not yet been created:

rails generate devise:views users
Do the migration rake db:migrate

Restart the server.

If you are not using :reconfirmable (i.e leave the commented out lines as they are in the change method described above), update the configuration in config/initializers/devise.rb

config.reconfirmable = false

SMTP Setting:

config.action_mailer.raise_delivery_errors = true
  config.action_mailer.perform_deliveries = true
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    :address => "smtp.gmail.com",
    :port => "587",
    :domain => "localhost",
    :user_name => "zz.zz@gmail.com",
    :password => "zzzzzzzzzz",
    :authentication => "plain",
    :enable_starttls_auto => true
  }