Ruby on Rails - Controlador

El controlador Rails es el centro lógico de su aplicación. Coordina la interacción entre el usuario, las vistas y el modelo. El controlador también alberga una serie de importantes servicios auxiliares.

  • Es responsable de enrutar las solicitudes externas a las acciones internas. Maneja extremadamente bien las URL amigables para las personas.

  • Gestiona el almacenamiento en caché, lo que puede dar a las aplicaciones mejoras de rendimiento de órdenes de magnitud.

  • Gestiona módulos auxiliares, que amplían las capacidades de las plantillas de vista sin aumentar su código.

  • Gestiona sesiones, dando a los usuarios la impresión de una interacción continua con nuestras aplicaciones.

El proceso para crear un controlador es muy fácil y es similar al proceso que ya usamos para crear un modelo. Crearemos solo un controlador aquí -

library\> rails generate controller Book

Observe que está escribiendo Libro en mayúsculas y usando la forma singular. Este es un paradigma de Rails que debe seguir cada vez que cree un controlador.

Este comando realiza varias tareas, de las cuales las siguientes son relevantes aquí:

  • Crea un archivo llamado app/controllers/book_controller.rb

Si mira book_controller.rb, lo encontrará de la siguiente manera:

class BookController < ApplicationController
end

Las clases de controlador heredan de ApplicationController, que es el otro archivo en la carpeta de controladores:application.rb.

El ApplicationController contiene código que se puede ejecutar en todos sus controladores y hereda de Rails ActionController :: clase Base .

Todavía no necesita preocuparse con ApplicationController , así que definamos algunos códigos auxiliares de método enbook_controller.rb. Según sus necesidades, puede definir cualquier número de funciones en este archivo.

Modifique el archivo para que tenga el siguiente aspecto y guarde los cambios. Tenga en cuenta que depende de usted qué nombre desea dar a estos métodos, pero es mejor dar nombres 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

Ahora implementemos todos los métodos uno por uno.

Implementando el método de lista

El método de lista le da una lista de todos los libros de la base de datos. Esta funcionalidad se logrará mediante las siguientes líneas de código. Edite las siguientes líneas en el archivo book_controller.rb.

def list
   @books = Book.all
end

La línea @books = Book.all del método list le dice a Rails que busque en la tabla de libros y almacene cada fila que encuentre en el objeto de instancia @books.

Implementación del método show

El método show muestra solo más detalles en un solo libro. Esta funcionalidad se logrará mediante las siguientes líneas de código.

def show
   @book = Book.find(params[:id])
end

La línea @book = Book.find (params [: id]) del método show le dice a Rails que busque solo el libro que tiene el id definido en params [: id].

El objeto params es un contenedor que le permite pasar valores entre llamadas a métodos. Por ejemplo, cuando estás en la página llamada por el método de lista, puedes hacer clic en un enlace para un libro específico, y pasa la identificación de ese libro a través del objeto params para que el programa pueda encontrar el libro específico.

Implementando el nuevo método

El nuevo método le permite a Rails saber que creará un nuevo objeto. Así que simplemente agregue el siguiente código en este método.

def new
   @book = Book.new
   @subjects = Subject.all
end

Se llamará al método anterior cuando muestre una página al usuario para que tome la entrada del usuario. Aquí, la segunda línea toma todos los sujetos de la base de datos y los coloca en una matriz llamada @subjects.

Implementando el método de creación

Una vez que tome la entrada del usuario usando el formulario HTML, es hora de crear un registro en la base de datos. Para lograr esto, edite el método de creación en book_controller.rb para que coincida con lo siguiente:

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

La primera línea crea una nueva variable de instancia llamada @book que contiene un objeto Book construido a partir de los datos enviados por el usuario. losbook_params El método se utiliza para recopilar todos los campos del objeto. :books. Los datos se pasaron del nuevo método para crear utilizando el objeto params.

La siguiente línea es una declaración condicional que redirige al usuario a la listmétodo si el objeto se guarda correctamente en la base de datos. Si no se guarda, el usuario vuelve al método nuevo. El método redirect_to es similar a realizar una metaactualización en una página web: lo reenvía automáticamente a su destino sin ninguna interacción del usuario.

Entonces @subjects = Subject.all es necesario en caso de que no guarde los datos correctamente y se convierta en un caso similar al de la nueva opción.

Implementación del método de edición

El método de edición parece casi idéntico al método show. Ambos métodos se utilizan para recuperar un solo objeto en función de su identificación y mostrarlo en una página. La única diferencia es que el método show no se puede editar.

def edit
   @book = Book.find(params[:id])
   @subjects = Subject.all
end

Este método será llamado para mostrar datos en la pantalla para ser modificados por el usuario. La segunda línea toma todos los sujetos de la base de datos y los coloca en una matriz llamada @subjects.

Implementar el método de actualización

Este método se llamará después del método de edición, cuando el usuario modifica un dato y desea actualizar los cambios en la base de datos. El método de actualización es similar al método de creación y se utilizará para actualizar los libros existentes en la base de datos.

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

El método update_attributes es similar al método de guardar utilizado por create, pero en lugar de crear una nueva fila en la base de datos, sobrescribe los atributos de la fila existente.

Entonces @subjects = Subject.all se requiere toda la línea en caso de que no guarde los datos correctamente, entonces se vuelve similar a la opción de edición.

Implementación del método de eliminación

Si desea eliminar un registro de la base de datos, utilizará este método. Implemente este método de la siguiente manera.

def delete
   Book.find(params[:id]).destroy
   redirect_to :action => 'list'
end

La primera línea busca el clasificado según el parámetro pasado a través del objeto params y luego lo elimina usando el método de destrucción. La segunda línea redirige al usuario al método de lista mediante una llamada redirect_to.

Métodos adicionales para mostrar sujetos

Suponga que desea ofrecer a sus usuarios la posibilidad de explorar todos los libros basados ​​en un tema determinado. Entonces, puede crear un método dentro de book_controller.rb para mostrar todos los temas. Suponga que el nombre del método esshow_subjects -

def show_subjects
   @subject = Subject.find(params[:id])
end

Finalmente tu book_controller.rb El archivo se verá de la siguiente manera:

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

Ahora guarde su archivo de controlador.

¿Lo que sigue?

Ha creado casi todos los métodos, que funcionarán en el backend. A continuación, definiremos rutas (URL) para acciones.