http://marvinlemos.net http://zerokol.com LU: 30-01-12 Oficinas de Verão UESPI 2012 Mini Curso: Ruby on Rails @marvinlemos @zerokol
SOBRE O PROFESSOR Marcus Vinícius de Sousa Lemos Mestre em Informática Aplicada pela Univer. de Fortaleza Unifor Professor da Universidade Estadual do Piauí Uespi Professor da Faculdade de Tecnologia de Teresina CET Auditor Fiscal de Controle Externo (Informática) TCE/PI marvinlemos@gmail.com http://www.marvinlemos.net @marvinlemos
SOBRE O PROFESSOR Antonio José de Oliveira Alves Bacharel em Ciências da Computação UESPI Gerente de projetos na Empresa Cajuina Labs cajuinalabs.com.br aj.zerokol@gmail.com aj.alves@cajuinalabs.com.br http://zerokol.com @zerokol
OBJETIVOS Imersão na linguagem de programação Ruby Apresentar o framework Rails Levar os alunos do ZERO/Iniciante ao Básico Intermediário no Ruby on Rails
O que é Ruby e o que é Rails?
O que é o Ruby #mais_poderosa_que_perl_e_mais_orientada_a_objeto_que_python #Japão Yukihiro "Matz" Matsumoto #script 12 10 @yukihiro_matz 8 6 4 2 0 Row 1 Row 2 Row 3 Row 4 #1995 Column 1 Column 2 Column 3 #12º_ling_de prog_+_pop_do_mundo
O que é o Ruby Interpretada Multiparadigma #programação_funcional #orientada_a_objetos #imperativa #reflexiva Tipagem dinâmica e forte
O que é o Ruby gerenciamento de memória automático Última versão: 1.9.2 p290 (15 de julho de 2011) Influenciada por: Ada, CLU, Dylan, Eiffel, Lisp, Perl, Python, Scheme, Smalltalk Influenciou: Falcon, Fantom, Groovy, Ioke, Nu Página oficial www.ruby lang.org
O que é o Rails #meta-framework @dhh David Heinemeier Hansson #MVC #open_source #2004 #framework
O que é o Rails DRY Convention over configuration Escalabilidade Padrão de projeto MVC (Model View Controller) Versão estável: 3.2.1 (20 de janeiro de 2012) Página oficial: rubyonrails.org
Mas, MVC?!
O que é o MVC Trygve Reenskaug #smalltalk #1979
O que é o MVC Model view controller (MVC)
E agora, o que falta?
Configurarando o Ambiente Instalar e Configurar o Ruby Instalar e Configurar o RubyGems Instalar e Configurar o Rails Instalar e Configurar o DB de sua preferência. http://www.zerokol.com/2012/01/configurando-ambiente-ruby-on-rails-32.html http://www.geeksbr.com/2010/03/instalando-o-ruby-on-rails-no-windows.html
Enfim, Ruby on Rail!!!
Minha primeira APP Prova de conceito (Aula) Escola Sistema Web para gerenciar os professores cursos e alunos de uma determinada escola, cada curso deve ter um professor e pode aceitar até 20 alunos por curso. Todos os cursos pertencem a uma categoria. O sistema deve possuir uma área interna onde o administrador cadastrará os cursos e professores.
Minha primeira APP Prova de conceito (Casa) Locadora Sistema Web para gerenciar uma locadora de jogos de videogame. Os consoles dividem se em categorias, cada console pode ter varios jogos, a vários jogos de cada jogo, o sistema deve controlar a disponibilidade de locação. Há também um cadastro de usuários associados, que devem informar sempre um estado e cidadade, exite a possibilidade de ver um histórico de locação de cada usuário. Um administrador deve cadastrar os consoles, games, estados e cidades.
Minha primeira APP > rails new minha_app Estrutura de pastas app config db Public > rails server Servidor de Teste webrick
Minha primeira APP Estrutura de pastas app assets controllers helbers maillers models views
Minha primeira APP Estrutura de pastas config environments initializers locales Arquivos application.rb database.yml routes.rb
Minha primeira APP Estrutura de pastas db migrate Arquivos seeds.rb Pasta PUBLIC
Eu lhes apresento, GIT!
O que é o GIT #Linus_Torvalds Semelhante ao SVN, Mercurial... Versionador de Código GitHub Free GIT Server
O que é o GIT Instalando e configurando o GIT Material ótimo em: http://gitref.org/ Instalar o Git no Ubuntu > sudo apt get install git Após instalado, configurar Git > git config global user.name "AJ Alves" > git config global user.email zerokol@ymail.com Obs:. É de grande importância adicionar sua chave pública ao github, Veja como em: http://help.github.com/linux set up git/
O que é o GIT Cadastrando se ao GITHUB.com Cadastrar se em https://github.com/ Criar novo repositório Create new Repository Mover se para a pasta criada à ser versionada > cd escola Inicializar e enviar > git init > git add. > git commit m 'first commit' > git remote add origin git@github.com:... > git push origin master Ps:. Não há a necessidade de Criar o aquivo README touch README, ele já é gerado automaticamente pelo Rails.
CRUD Quatro operações básicas CRUD Create INSERT Read (Retrived) SELECT Update UPDATE Delete (Destroy) DELETE
GENERATORS Geradores de Código > rails generate ou > rails destroy assets controller generator helper integration_test mailer migration model observer performance_test resource scaffold scaffold_controller session_migration task
Gerador SCAFFOLD Criando Models, Views e Controllers > rails generate scaffold Model Tipos suportados :binary :boolean :date :datetime :decimal :float :integer :primary_key :string :text :time :timestamp
Gerador SCAFFOLD Criando Modelos, Visões e Controladores Arquivo de Controle Arquivo de Visão app/controllers ActionController::Base app/helpers app/views app/assets Arquivo de Modelo app/models ActiveRecord::Base db/migrate ActiveRecord::Migration Arquivo config/routes.rb
Migrates Migrate Metodos de Migração up Fazer down Desfazer change Fazer, Desfazer óbvio Operaçõe de migração add_column add_index create_table change_column change_table http://guides.rubyonrails.org/migrations.html remove_column remove_index drop_table rename_column Usar CHANGE Usar UP e DOWN
Migrates Tipos especiais timestamps references Migrando o banco com Rake > rake db:create > rake db:migrate > rake db:drop > rake db:rollback STEP=3 > rake db:reset > rake db:migrate:up VERSION= NUM Impedindo a criação de created_at e updated_at Adicionar a config/application.rb config.active_record.timestamped_migrations = false
Routes resources Roteamento Padrão Cria rotas para index, show, new, edit, create, update e destroy Usa os metodos GET, POST, PUT e DELETE 7 requests diferentes Caminhos photos_path returns /photos new_photo_path returns /photos/new edit_photo_path(:id) returns /photos/:id/edit photo_path(:id) returns /photos/:id resources!= resource http://guides.rubyonrails.org/routing.html
Routes Namespaces namespace :admin do resources :posts end Nested Resources resources :magazines do resources :ads end Seguimentos post, puts, get, delete match
Routes Seguimentos estáticos match curso_especial => courses#special Seguimentos dinâmicos match aluno/:id => students#get_aluno Nomeando rotas para gerar caminhos Root match aluno/:id => students#get_aluno, :as => :aluno root :to => 'pages#main' Explorando com Rake > rake routes
Model Associações Tipos de associação belongs_to has_one has_many has_one :through has_many :through Opções de associação :dependent => :nullify :destroy :update :foreign_key http://guides.rubyonrails.org/association_basics.html
Model Validações Tipos de validações validates_associated validates :email, OPÇÃO :confirmation => true :presence => true :format => { :with => /\A[a za Z]+\z/, :message => "Only letters allowed" } :length => { :minimum => 2, :maximum => 500 } :numericality => { :only_integer => true } :uniqueness => true http://guides.rubyonrails.org/active_record_validations_callbacks.html
Model Callbacks Callbacks before_create after_create before_updade after_update before_destroy after_destroy before_add after_add before_remove after_remove http://guides.rubyonrails.org/active_record_validations_callbacks.html
Populando com SEED Geradores de Migrations, Controllers Seeds db/seeds.rb > rake db:seed > rake db:setup db/schema.rb Gerador de Migrações > rails generate controller Gerador de Controllers > rails generate migration
Comandos ActiveRecord Brincar com o IRB SQL Puro > rails console ActiveRecord Model.all() Model.find() ActiveRecord::Base.connection.execute(full_query) Transação Item.transaction do i = Item.lock.first :select => i.name = 'Jones' :conditions => :joins => :limit => :order => :group => i.save end Migrar de SGBD Configurar database.yml http://guides.rubyonrails.org/active_record_querying.html
Internacionalização Intenacionalização com i18n config/application.rb config.i18n.default_locale = "pt BR" Pasta config/locales https://github.com/svenfuchs/rails i18n/blob/master/rails/locale/pt BR.yml Pt br?locale=en http://guias.rubyonrails.com.br/i18n.html
Hellpers e Layout Hellpers Layout
Deploy Deploy == Por sua aplicação em Produção Passo 1: Cadastrars se no Heroku http://heroku.com Passo 2: Ler o Passo a Passo da Heroku http://devcenter.heroku.com/articles/quickstart Passo 3: Fazer o Passo 4 da Heroku para Rails Continua no próximo slide
Deploy Portar do Github para o Heroku > rm rf.git Configurar Gemfile group :development, :test do end gem 'sqlite3' group :production do gem 'thin' gem 'pg' Facilidades da Heroku Não precisa compilar os assets Não precisa configurar o database.yml end gem 'heroku'
Deploy Reinstalar arquivos GIT > git init > git add. > git commit m "primeiro commit" Criar APP na Heroku > heroku create my_app stack cedar Deploy na Heroku é AUTOMÁTICO no git push > git push heroku master
Deploy Comandar APP Remotamente > sudo heroku run COMANDOS QUAISQUER Ex:. > sudo heroku run rake db:migrate Comandar Úteis > sudo heroku keys:add ~/.ssh/id_rsa.pub > sudo heroku ps > heroku logs Menu HEROKU My Apps Servidor Git Minha APP é: http://escola.herokuapp.com
Trabalhando com GEMs.
Gem Devise Controle de Autenticação Controle de Autenticação Devise https://github.com/plataformatec/devise Criar um MODEL para a atividade EX:. users Adicionar ao Gemfile gem 'desvise' Configurar Devise na sua APP rails generate devise:install rails generate devise MODEL Ex:. Se users, aqui é user Obs:. Cuidado com o atributo EMAIL Add em config/envioriments/production.rb config.action_mailer.default_url_options = { :host => 'localhost:3000' } Add em app/views/layouts/application.html.erb <p class="notice"><%= notice %></p> <p class="alert"><%= alert %></p>
Gem Devise Controle de Autenticação Add em config/application.rb Importante para o HEROKU config.assets.initialize_on_precompile = false Add linha abaixo aos controllers para negar acesso, caso o Model seja user before_filter :authenticate_user! O que foi adicionado pelo DEVISE config/initializers/devise.rb app/models/users.rb config/routes.rb Métodos úteis user_signed_in? current_user user_session rails generate devise:views users
Ruby on Rails Gem Declarative Authorization Autorização Controle de Autorização Declarative Authorization https://github.com/stffn/declarative_authorization Adicionar ao Gemfile gem 'declarative_authorization' Criar arquivo de permissões config/authorization_rules.rb authorization do role :admin do has_permission_on [:users], :to => [:manage] end role :guest do end end privileges do privilege :manage, :includes => [:index, :show, :new, :create, :edit, :update, :destroy] privilege :read, :includes => [:index, :show] privilege :create, :includes => [:new] privilege :update, :includes => [:edit] privilege :delete, :includes => [:destroy] end
Gem Declarative Authorization Autorização Criar um Model chamado Roles > rails generate model role name:string description:string Add role_id em USERS > rails generate migration AddRoleIdToUsers add_column(:users, :role_id, :integer) Relacionando Users e Roles Em USERS.rb add: belongs_to :role Em ROLES.rb add: has_many :users
Gem Declarative Authorization Autorização Add a app/controllers/applicarion_controller.rb #Filtro do declarative authorization para todos os controllers before_filter { c Authorization.current_user = c.current_user } #mensagem em caso de usuário não autorizado protected def permission_denied flash[:error] = "Desculpe, você não tem permisão." redirect_to root_url end
Gem Declarative Authorization Autorização Add a app/models/user.rb ############################## CALLBACK before_create :setting_user_default def setting_user_default self.role = Role.find(:first, :conditions => {:name => 'admin'}) end ############################## DECLARATIVE AUTHORIZATION def role_symbols [role.name.underscore.to_sym] end
Gem Declarative Authorization Autorização Métodos úteis Controllers Views filter_resource_access filter_access_to :all Ps:. Podem ser os nomes das Actions <% permitted_to? :create, :courses do %> <%= link_to 'New', new_courses_path %> <% end %> Controllers using_access_control Obs:. não usar os metodos do DA com os do DEVISE
REFERÊNCIAS http://pt.wikipedia.org/wiki/ruby_%28linguagem_de_programa%c3%a7%c3%a3o%29 http://pt.wikipedia.org/wiki/ruby_on_rails http://pt.wikipedia.org/wiki/mvc http://www.zerokol.com/2012/01/configurando-ambiente-ruby-on-rails-32.html http://pt.wikipedia.org/wiki/crud http://guides.rubyonrails.org http://gitref.org/