quarta-feira, 15 de janeiro de 2014

Ruby - How to Create GEMS

How to Create GEMS
    Very simple to create a GEM
    1. Create the directory structure
    .
    --- Rakefile
    --- bin
         --- hello_anderson
    --- hello_anderson.gemspec
    --- lib
         --- hello_anderson.rb
    --- test
         --- test_hello_anderson.rb

        Inside lib it is necessary to have a rb file with the same name of the GEM.
        Ex:
            class HelloAnderson
              def self.say_hello
                puts "Hello Anderson!"
              end
            end

    hello_anderson.gemspec is responsible for model the gem.  Inside it we have what the gem is and its version. 
    Ex:
        Gem::Specification.new do |s|
          s.name        = 'hello_anderson'
          s.version     = '0.0.0'
          s.date        = '2013-12-12'
          s.summary     = "Hellow Anderson!"
          s.description = "Example of a gem saing hello to Anderson"
          s.authors     = ["Anderson Araujo Lopes"]
          s.email       = 'romalopes@yahoo.com.br'
          s.files       = ["lib/hello_anderson.rb", other files...]
          s.homepage    =
            'http://rubygems.org/gems/hello_anderson'
          s.license       = 'MIT'
        end

    To build a GEM
        $ gem build hello_anderson.gemspec
    To install a GEM
        $ gem install ./hello_anderson-0.0.0.gem

    To use a GEM
        use: require "hello_anderson"
                HelloAnderson.say_hello

    The published geuemms are in:
        http://rubygems.org/
        Process:
        1. To setup the computer with your RubyGems account:
            $ curl -u qrush https://rubygems.org/api/v1/api_key.yaml >
~/.gem/credentials; chmod 0600 ~/.gem/credentials
        2 . gem push hello_anderson-0.0.0.gem

    To see the GEM in rubygems.org
        $ gem list -r hello_anderson
    To install the GEM from rubygems.org
        $ gem install hola

Adding a executable
    place the file bin/hello_anderson
    chmod a+x bin/hello_anderson

    #!/usr/bin/env ruby

    require 'hello_anderson'
    puts Hola.say_hello()


    To run the GEM
        $ ruby -Ilib ./bin/hello_anderson

    Test
        Fill Rakefile
            require 'rake/testtask'
            Rake::TestTask.new do |t|
              t.libs << 'test'
            end

            desc "Run tests"
            task :default => :test

        Fill test/test_hello_anderson.rb
            require 'test/unit'
            require 'hello_anderson'

            class HelloAndersonTest < Test::Unit::TestCase
              def test_hello_anderson
                assert_equal "Hello Anderson", HelloAnderson.say_hello
              end
            end

        run test
            $ rake test
            OR
            $ rake

    Document
        Gems use RDoc to generate docs


Ruby on Rails-Action Mailer Basics

====
   Based on guides.rubyonrails.org

Action Mailer Basics
    Send eails using mailer classes and views
    Class inherit from ActionMailer::Base and live in app/mailers
    Mailers are conceptually similar to controllers
    Steps
    1. Create the mailer
        $ rails generate mailer UserMailer
        user_mailer.rb created
            class UserMailer < ActionMailer::Base
              default from: 'from@example.com'      <-- br="" default="" from="">            end
    2. It is possible jusst to create the Mailer in app/mailers
        class MyMailer < ActionMailer::Base
        end
    3. Add a method called welcome
         def welcome_email(user)
            @user = user
            @url  = 'http://example.com/login'
            mail(to: @user.email, subject: 'Welcome to My Awesome Site')
         end
    4. Create the views/user_mailer/welcome.html.erb
       
       
         
           
         
         
           

Welcome to example.com, <%= @user.name %>


           
              You have successfully signed up to example.com,
              your username is: <%= @user.login %>.

           

           
              To login to the site, just follow this link: <%= @url %>.
           

            Thanks for joining and have a great day!

         
       
        4.1 It is possible to create a text(non html) file too. welcome_email.text.erb
    With method webcome_email, rails will automatically render both html and text files.
    5. In method create of UsersController
          if @user.save
            # Tell the UserMailer to send a welcome Email after save
            UserMailer.welcome_email(@user).deliver


Ruby on Rails-Working with JavaScript in Rails

====
   Based on guides.rubyonrails.org




Working with JavaScript in Rails
    Unobtrusive JavaScript
        Jaav uses a "Unobtrusive javaScript" technique
        EX:

            < a href="#" data-background-color="#990000">Paint it red< /a>


            data-background is called in unobtrusive way because there is no mix between JavaScript and HTML
        Call:
            paintIt = (element, backgroundColor, textColor) ->
              element.style.backgroundColor = backgroundColor
              if textColor?
                element.style.color = textColor
           
            $ ->
              $("a[data-background-color]").click ->
                backgroundColor = $(this).data("background-color")
                textColor = $(this).data("text-color")
                paintIt(this, backgroundColor, textColor)
    Built-in Helpers
        Many view helper methods to assist generating HTML.

        form_for
            <%= form_for(@post, remote: true) do |f| %>
              ...
            <% end %>
        form_tag
            <%= form_tag('/posts', remote: true) %>
        link_to
            <%= link_to "a post", @post, remote: true %>

            <%= link_to "Delete post", @post, remote: true, method: :delete %>

            in CoffeScript, uses
                $ -> $("a[data-remote]").on "ajax:success", (e, data, status, xhr) -> alert "The post was deleted."
            or in directly
                <%= link_to "delete", account, method: :delete, data: { confirm: "You sure?" } %>
        button_to
            <%= button_to "A post", @post, remote: true %>
    The server side
        Usually, AJAX requests return JSON rather than HTML
            Controller
                class UsersController < ApplicationController
                  def index
                    @users = User.all
                    @user = User.new
                  end
                  def create
                      @user = User.new(params[:user])
                   
                      respond_to do |format|
                        if @user.save
                          format.html { redirect_to @user, notice: 'User was successfully created.' }
                          format.js   {}
                          format.json { render json: @user, status: :created, location: @user }
                        else
                          format.html { render action: "new" }
                          format.json { render json: @user.errors, status: :unprocessable_entity }
                        end
                      end
                    end
            index.html.erb
                < b >Users< /b >
   
                < ul id="users">  <----- appendto="" br="" fill="" here="" in="" js="" the="" will="">                    <% @users.each do |user| %>
                      <%= render user %>   <----- _user.html.erb="" br="" render="" the="">                    <% end %>
                < /ul >
               
                < br>
               
                <%= form_for(@user, remote: true) do |f| %>
                  <%= f.label :name %>

                  <%= f.text_field :name %>
                  <%= f.submit %>
                <% end %>
            _user.html.erb
                < li ><%= user.name %>< /li >
            create.js.erb
                It is called by the method create.
                $("<%= escape_javascript(render @user) %>").appendTo("#users");
    Turbolinks
        Uses AJAX to speed up page rendering in most applications
        It attaches a click handler to all < a > tags
        What to do
            Include turbolinks in Gemfile
            in app/assets/javascripts/application.js
                //= require turbolinks
            To disable turbolink
                < a href="..." data-no-turbolink>No turbolinks here< /a>.


terça-feira, 14 de janeiro de 2014

Ruby on Rails-Rails Routing from the Outside In

====
   Based on guides.rubyonrails.org

Rails Routing from the Outside In

    The Purpose of the Rails Router
        Simple example:
                                GET /patients/17
                    Route
                                get '/patients/:id', to: 'patients#show'

        Or
                    get '/patients/:id', to: 'patients#show', as: 'patient'
                    and your application contains this code in the controller:
                                @patient = Patient.find(17)
                    and this in the corresponding view:
                                <%= link_to 'Patient Record', patient_path(@patient) %>
                    Route will generate
                                /patients/17
        CRUD, Verbs, and Actions
            If declare
                resources :photos
                If creates 7 routes
                    HTTP        Verb             Path
                    GET        /photos             index  
                    GET        /photos/new      new
                    POST           /photos         create 
                    GET        /photos/:id         show  
                    GET        /photos/:id/edit edit     
                    PATCH/PUT  /photos/:id      update
                    DELETE     /photos/:id      destroy
            Singular resources
                To call
                    /profile
                route
                    get 'profile', to: 'users#show'

    A singular resourceful route generates these helpers:
        new_photo_path returns / photo /new
        edit_ photo _path returns / photo /edit
        photo _path returns / photo
        Controller Namespaces and routing
            It is possible to organize groups of controllers under a namespace
            EX:
            namespace : admin do
                            resources :posts, :comments
            end
            It will create routes for post and comments .  For Admin::PostController
                GET /admin/posts              admin_post_path
                GET /admin/posts/new         new_admin_post_path
                POST /admin/posts/:id       admin_post_path(:id)
                etc
            Uses Admin::PostController without the prefix /admin, just declares:
                scope module: ‘admin’ do
                    resources :posts, :comments   
                end
                OR
                resources :posts, module:’admin’

            To use /admin/post without  admin in path.
                Scope ‘/admin’ do
                                Resources :posts, :comments
                End
            Resources :posts, path: ‘/admin/posts’
                GET /admin/posts                           posts_path
                GET /admin/posts/new                                new_post_path
                Nested Resources
    when there are resources that are children of others.
        Models:
            class Magazine < ActiveRecord::Base
                  has_many
                    :ads
                end
             end
            class Ad < ActiveRecord::Base
                  belongs_to :magazine
            end
            Resources:
                resources :magazines do
                      resources :ads
                end
            /magazines/:magazine_id/ads
            /magazines/:magazine_id/ads/new
            /magazines/:magazine_id/ads
            The url: edit_magazine_ad_path
            It is possible to nest 2 levels
   
        resources :publishers do
          resources :magazines do
            resources :photos
          end
        end
        Calling:
            /publishers/1/magazines/2/photos/3
    Paths and URLs From Objects
        resources :magazines do
          resources :ads
        end
        You can pass instances of magazines and ads
            <%= link_to 'Ad details', magazine_ad_path(@magazine, @ad) %>
        Or
            <%= link_to 'Ad details', url_for([@magazine, @ad]) %>
            Or
            <%= link_to 'Ad details', [@magazine, @ad] %>
            Rails will se magazines and ads and create the path.
        To call Edit
        <%= link_to 'Edit Ad', [:edit, @magazine, @ad] %>
    Adding More RESTful Actions
        Add Member Routes
            resources :photos do
              member do
                get 'preview'
              end
            end
            Provides:   
            GET     /photos/1/preview
            and preview_photo_url and preview_photo_path helpers