Ruby on Rails - controlador
O controlador Rails é o centro lógico de sua aplicação. Ele coordena a interação entre o usuário, as visualizações e o modelo. O controlador também é o lar de uma série de serviços auxiliares importantes.
É responsável por encaminhar solicitações externas para ações internas. Ele lida com URLs amigáveis às pessoas extremamente bem.
Ele gerencia o cache, o que pode dar aos aplicativos aumentos de desempenho de ordens de magnitude.
Ele gerencia os módulos auxiliares, que estendem os recursos dos modelos de visualização sem aumentar seu código.
Ele gerencia as sessões, dando aos usuários a impressão de uma interação contínua com nossos aplicativos.
O processo de criação de um controlador é muito fácil e semelhante ao processo que já usamos para criar um modelo. Vamos criar apenas um controlador aqui -
library\> rails generate controller Book
Observe que você está capitalizando Livro e usando a forma singular. Este é um paradigma Rails que você deve seguir toda vez que criar um controlador.
Este comando realiza várias tarefas, das quais as seguintes são relevantes aqui -
Ele cria um arquivo chamado app/controllers/book_controller.rb
Se você olhar para book_controller.rb, você o encontrará da seguinte maneira -
class BookController < ApplicationController
end
As classes de controlador são herdadas de ApplicationController, que é o outro arquivo na pasta de controladores:application.rb.
O ApplicationController contém código que pode ser executado em todos os seus controladores e é herdado da classe Rails ActionController :: Base .
Você não precisa se preocupar com o ApplicationController ainda, então vamos apenas definir alguns stubs de método embook_controller.rb. Com base em seus requisitos, você pode definir qualquer número de funções neste arquivo.
Modifique o arquivo para se parecer com o seguinte e salve suas alterações. Observe que depende de você qual nome deseja dar a esses métodos, mas é melhor dar nomes relevantes.
class BookController < ApplicationController
def list
end
def show
end
def new
end
def create
end
def edit
end
def update
end
def delete
end
end
Agora, vamos implementar todos os métodos um por um.
Implementando o método de lista
O método de lista fornece uma lista de todos os livros no banco de dados. Essa funcionalidade será alcançada pelas seguintes linhas de código. Edite as seguintes linhas no arquivo book_controller.rb.
def list
@books = Book.all
end
A linha @books = Book.all no método list diz ao Rails para pesquisar a tabela books e armazenar cada linha que encontrar no objeto de instância @books.
Implementando o método show
O método show exibe apenas mais detalhes em um único livro. Essa funcionalidade será alcançada pelas seguintes linhas de código.
def show
@book = Book.find(params[:id])
end
A linha @book = Book.find (params [: id]) do método show diz ao Rails para encontrar apenas o livro que tem o id definido em params [: id].
O objeto params é um contêiner que permite a você passar valores entre chamadas de método. Por exemplo, quando você está na página chamada pelo método list, você pode clicar em um link para um livro específico, e ele passa o id desse livro por meio do objeto params para que show possa encontrar o livro específico.
Implementando o novo método
O novo método permite ao Rails saber que você criará um novo objeto. Portanto, basta adicionar o código a seguir neste método.
def new
@book = Book.new
@subjects = Subject.all
end
O método acima será chamado quando você exibir uma página para o usuário receber a entrada do usuário. Aqui, a segunda linha pega todos os assuntos do banco de dados e os coloca em um array chamado @subjects.
Implementando o Método de Criação
Depois de obter a entrada do usuário usando o formulário HTML, é hora de criar um registro no banco de dados. Para conseguir isso, edite o método de criação no book_controller.rb para corresponder ao seguinte -
def create
@book = Book.new(book_params)
if @book.save
redirect_to :action => 'list'
else
@subjects = Subject.all
render :action => 'new'
end
end
def book_params
params.require(:books).permit(:title, :price, :subject_id, :description)
end
A primeira linha cria uma nova variável de instância chamada @book que contém um objeto Book construído a partir dos dados que o usuário enviou. obook_params método é usado para coletar todos os campos do objeto :books. Os dados foram passados do novo método a ser criado usando o objeto params.
A próxima linha é uma declaração condicional que redireciona o usuário para o listmétodo se o objeto for salvo corretamente no banco de dados. Se não salvar, o usuário é enviado de volta ao novo método. O método redirect_to é semelhante a realizar uma meta atualização em uma página da web: ele o encaminha automaticamente para o seu destino sem nenhuma interação do usuário.
Então @subjects = Subject.all é necessário caso não salve os dados com sucesso e se torna um caso semelhante ao da nova opção.
Implementando o método de edição
O método de edição parece quase idêntico ao método show. Ambos os métodos são usados para recuperar um único objeto com base em seu id e exibi-lo em uma página. A única diferença é que o método show não é editável.
def edit
@book = Book.find(params[:id])
@subjects = Subject.all
end
Este método será chamado para exibir dados na tela a serem modificados pelo usuário. A segunda linha pega todos os assuntos do banco de dados e os coloca em um array chamado @subjects.
Implementando o método de atualização
Este método será chamado após o método de edição, quando o usuário modifica um dado e deseja atualizar as alterações no banco de dados. O método de atualização é semelhante ao método de criação e será usado para atualizar livros existentes no banco de dados.
def update
@book = Book.find(params[:id])
if @book.update_attributes(book_param)
redirect_to :action => 'show', :id => @book
else
@subjects = Subject.all
render :action => 'edit'
end
end
def book_param
params.require(:book).permit(:title, :price, :subject_id, :description)
end
O método update_attributes é semelhante ao método save usado por create, mas em vez de criar uma nova linha no banco de dados, ele substitui os atributos da linha existente.
Então a linha @subjects = Subject.all é necessária caso não salve os dados com sucesso, então ela se torna semelhante à opção de edição.
Implementando o Método de Exclusão
Se quiser excluir um registro do banco de dados, você usará este método. Implemente este método da seguinte maneira.
def delete
Book.find(params[:id]).destroy
redirect_to :action => 'list'
end
A primeira linha encontra o classificado com base no parâmetro passado por meio do objeto params e o exclui usando o método destroy. A segunda linha redireciona o usuário para o método list usando uma chamada redirect_to.
Métodos adicionais para exibir assuntos
Suponha que você queira dar aos usuários a possibilidade de navegar em todos os livros com base em um determinado assunto. Portanto, você pode criar um método dentro de book_controller.rb para exibir todos os assuntos. Suponha que o nome do método sejashow_subjects -
def show_subjects
@subject = Subject.find(params[:id])
end
Finalmente seu book_controller.rb arquivo terá a seguinte aparência -
class BooksController < ApplicationController
def list
@books = Book.all
end
def show
@book = Book.find(params[:id])
end
def new
@book = Book.new
@subjects = Subject.all
end
def book_params
params.require(:books).permit(:title, :price, :subject_id, :description)
end
def create
@book = Book.new(book_params)
if @book.save
redirect_to :action => 'list'
else
@subjects = Subject.all
render :action => 'new'
end
end
def edit
@book = Book.find(params[:id])
@subjects = Subject.all
end
def book_param
params.require(:book).permit(:title, :price, :subject_id, :description)
end
def update
@book = Book.find(params[:id])
if @book.update_attributes(book_param)
redirect_to :action => 'show', :id => @book
else
@subjects = Subject.all
render :action => 'edit'
end
end
def delete
Book.find(params[:id]).destroy
redirect_to :action => 'list'
end
def show_subjects
@subject = Subject.find(params[:id])
end
end
Agora salve o arquivo do controlador.
O que vem a seguir?
Você criou quase todos os métodos, que funcionarão no backend. Em seguida, definiremos as rotas (URLs) para as ações.