Temas:
- Criação de uma aplicação do zero: loja virtual de filmes;
- Repositório git;
- Uso de gemsets;
- Criação dos modelos;
- Seeds a partir de dados em CSV;
- Adição da gem 'bootstrap';
- Criação da página inicial;
- Divisão do conteúdo em partials;
- Implementação de uma busca simples.
- Repositório git;
Repositório git com a Aplicação Movie-Store: https://github.com/alexkutzke/movie-store-cursoror
Configuração do ambiente para o uso do git.
$ git config --global user.name "Alex Kutzke"
$ git config --global user.email "[email protected]"
Criação da Aplicação Movie Store.
$ cd /vagrant
$ rails new movie_store
$ cd movie_store
Criação e indicação de uma Gemset para a aplicação.
$ cat > .ruby-version
# digitar 2.3.3
# pressionar <enter>
# pressionar ctrl+d
$ cat > .ruby-gemset
# digitar movie_store
# pressionar <enter>
# pressionar ctrl+d
$ cd ..
$ cd movie_store
$ gem install blundle
$ bundle install
Nesse momento, cria-se o novo repositório no github.
# na pasta da aplicação
$ git init
# Edit README.md
$ git add .
$ git commit -am "Initial commit"
$ git remote add origin https://github.com/PATH_PARA_O_SEU_REPO.git
$ git push origin master
Com o repositório pronto, podemos começar as alterações na aplicação.
Lembre-se de descomentar a linha 22 do arquivo Gemfile para que a gem 'therubyracer' seja instalada. Além disso, se estiver utilizando o vagrant altere o arquivo config/environments/development.rb na linha 8, adicionando o seguinte:
# Edit config/environments/development.rb:8
config.reload_classes_only_on_change = false
# Instalar a gem.
$ bundle Install
Os primeiros modelos a serem criados serão chamados de Movies, Actors e Directors.
# Cria modelo para filmes
$ rails g model movie title:string year:integer runtime:string genre:string plot:text language:string country:string awards:string poster_url:string imdb_id:string imdb_rating:string
$ rails db:migrate
# cria modelos para autores e diretores
$ rails g model actor name:string
$ rails g model director name:string
Nesse momento, é necessário adicionar um relacionamento "muitos para muitos" nos modelos recém criados. Para isso, adicione o seguinte no arquivo 'app/models/movie.rb'
has_and_belongs_to_many :actors
has_and_belongs_to_many :directors
E nos arquivos 'app/models/{actors.rb,director.rb}' adicione:
has_and_belongs_to_many :movies
Como o relacionamento criado é de "muitos para muitos", precisamos criar as Join tables para que a associação funcione.
# Cria migrations para join tables
$ rails g migration CreateJoinTableMovieActor movie actor
$ rails g migration CreateJoinTableMovieDirector movie director
$ rails db:migrate
Faça testes com o rails console para verificar se os modelos estão funcionando corretamente.
Se está tudo ok, agora devemos adicionar o suporte ao Bootstrap para nossa aplicação. Para isso, utilizaremos a gem 'bootstrap'. Portanto, adicione o seguinte código ao final do arquivo 'Gemfile.rb'.
# Gem bootstrap
gem 'bootstrap'
source 'https://rails-assets.org' do
gem 'rails-assets-tether', '>= 1.3.3'
end
$ bundle install
Para concluir a instalação do bootstrap, siga os passos de instalação da página da gem: https://github.com/twbs/bootstrap-rubygem
Agora, podemos iniciar o processo de criação do seeds.rb. Para esse seeds, utilizaremos uma base de dados de filmes pré-existente em um arquivo CSV. Portanto, baixe o arquivo abaixo e salve no (novo) diretório 'db/seeds_data' da sua aplicação:
http://cursorails.kutzke.com.br/movies.csv
Se quiser utilizar o terminal para isso, faça:
$ cd db
$ mkdir seeds_data
$ wget http://cursorails.kutzke.com.br/movies.csv
Para adicionar conteúdo ao 'db/seeds.rb' você pode copiar e colar do repositório da aplicação no meu github: https://github.com/alexkutzke/movie-store-cursoror/blob/master/db/seeds.rb
Agora basta executar o seeds:
$ rails db:seed
Novamente, execute testes com o rails console para verificar que o conteúdo da base de dados foi criado corretamente.
Agora podemos criar os scaffolds para filmes:
$ rails g scaffold movie title:string year:integer runtime:string genre:string plot:text language:string country:string awards:string poster_url:string imdb_id:string imdb_rating:string --skip-stylesheets
Note a opção para pular a criação dos estilos CSS para o scaffold. Fazemos isso para que as regras criadas não entrem em conflito com o bootstrap.
Adicionamos, agora, um controller para a página principal:
$ rails g controller store index
Adicione a opção "root 'store#index" ao routes.rb.
Agora, se desejar agilizar seu trabalho, copie os arquivos 'app/views/layouts/application.html.erb' e 'app/views/store/index.html.erb' do meu repositório git.
https://github.com/alexkutzke/movie-store-cursoror/blob/master/app/views/layouts/application.html.erb https://github.com/alexkutzke/movie-store-cursoror/blob/master/app/views/store/index.html.erb
Para que as viws acima funcionem, é necessário adicionar as seguintes partials:
Se desejar, copie os arquivos do meu repositório git.
Lembre-se de adicionar conteúdo necessário no controllador 'store#index'. Esse conteúdo deve carregar uma lista de filmes em @movies.
Adicione, também, o método 'to_s' aos Models Actor e Director, para que a exibição fique correta.
def to_s
self.name
end
Para implementar a busca, precisamos, em primeiro lugar, adicionar uma nova rota ao resource movies.
resources :movies do
collection do
get 'search'
end
end
Atenção ao formulário de busca já existente em 'app/views/layouts/application.html.erb'. Consegue utilizá-lo para realizar a busca? Para auxiliá-lo nesse processo, utilize o método where do ActiveRecord.