Учебники

Ruby on Rails — Контроллер

Контроллер Rails является логическим центром вашего приложения. Он координирует взаимодействие между пользователем, представлениями и моделью. Контроллер также является домом для ряда важных вспомогательных услуг.

  • Он отвечает за маршрутизацию внешних запросов к внутренним действиям. Он отлично обрабатывает удобные для пользователя URL-адреса.

  • Он управляет кэшированием, что может повысить производительность приложений на порядок.

  • Он управляет вспомогательными модулями, которые расширяют возможности шаблонов представления без увеличения объема их кода.

  • Он управляет сессиями, создавая у пользователей впечатление постоянного взаимодействия с нашими приложениями.

Он отвечает за маршрутизацию внешних запросов к внутренним действиям. Он отлично обрабатывает удобные для пользователя URL-адреса.

Он управляет кэшированием, что может повысить производительность приложений на порядок.

Он управляет вспомогательными модулями, которые расширяют возможности шаблонов представления без увеличения объема их кода.

Он управляет сессиями, создавая у пользователей впечатление постоянного взаимодействия с нашими приложениями.

Процесс создания контроллера очень прост, и он похож на процесс, который мы уже использовали для создания модели. Мы создадим только один контроллер здесь —

library\> rails generate controller Book

Обратите внимание, что вы используете заглавную букву и используете единственную форму. Это парадигма Rails, которой вы должны следовать каждый раз, когда создаете контроллер.

Эта команда выполняет несколько задач, из которых здесь важны следующие:

  • Он создает файл с именем app / controllers / book_controller.rb

Он создает файл с именем app / controllers / book_controller.rb

Если вы посмотрите на book_controller.rb, вы найдете его следующим образом:

class BookController < ApplicationController
end

Классы контроллеров наследуются от ApplicationController, который является другим файлом в папке контроллеров: application.rb .

ApplicationController содержит код, который можно запустить на всех ваших контроллерах, и он наследуется от Rails ActionController :: Base класса.

Вам пока не нужно беспокоиться о ApplicationController , поэтому давайте просто определим несколько заглушек методов в book_controller.rb . Исходя из ваших требований, вы можете определить любое количество функций в этом файле.

Измените файл так, чтобы он выглядел следующим образом, и сохраните изменения. Обратите внимание, что вам решать, какое имя вы хотите дать этим методам, но лучше дать соответствующие имена.

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

Теперь давайте реализуем все методы один за другим.

Реализация метода списка

Метод list дает вам список всех книг в базе данных. Эта функциональность будет достигнута с помощью следующих строк кода. Отредактируйте следующие строки в файле book_controller.rb.

def list
   @books = Book.all
end

Строка @books = Book.all в методе list указывает Rails искать в таблице книг и сохранять каждую найденную строку в объекте экземпляра @books.

Реализация метода шоу

Метод show отображает только дополнительную информацию об одной книге. Эта функциональность будет достигнута с помощью следующих строк кода.

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

Строка @book = Book.find (params [: id]) метода show указывает Rails найти только книгу, идентификатор которой определен в params [: id].

Объект params — это контейнер, который позволяет передавать значения между вызовами методов. Например, когда вы находитесь на странице, вызываемой методом list, вы можете щелкнуть ссылку для определенной книги, и она передает идентификатор этой книги через объект params, чтобы show могло найти конкретную книгу.

Внедрение нового метода

Новый метод позволяет Rails знать, что вы создадите новый объект. Так что просто добавьте следующий код в этот метод.

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

Вышеупомянутый метод будет вызван, когда вы отобразите страницу для пользователя, чтобы принять пользовательский ввод. Здесь вторая строка берет все предметы из базы данных и помещает их в массив с именем @subjects.

Реализация метода создания

После того как вы введете пользовательский ввод с помощью формы HTML, самое время создать запись в базе данных. Для этого отредактируйте метод create в book_controller.rb, чтобы он соответствовал следующему:

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

Первая строка создает новую переменную экземпляра с именем @book, которая содержит объект Book, созданный из данных, отправленных пользователем. Метод book_params используется для сбора всех полей из объекта : книги . Данные были переданы из нового метода для создания с использованием объекта params.

Следующая строка — это условный оператор, который перенаправляет пользователя в метод списка, если объект правильно сохраняется в базе данных. Если он не сохраняется, пользователь возвращается к новому методу. Метод redirect_to аналогичен мета-обновлению на веб-странице: он автоматически перенаправляет вас к месту назначения без какого-либо взаимодействия с пользователем.

Тогда @subjects = Subject.all требуется в случае, если данные не сохраняются успешно, и это становится аналогичным случаю с новой опцией.

Реализация метода редактирования

Метод edit выглядит практически идентично методу show. Оба метода используются для извлечения одного объекта на основе его идентификатора и отображения его на странице. Разница лишь в том, что метод show недоступен для редактирования.

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

Этот метод будет вызываться для отображения данных на экране, которые будут изменены пользователем. Вторая строка берет все предметы из базы данных и помещает их в массив с именем @subjects.

Реализация метода обновления

Этот метод будет вызываться после метода редактирования, когда пользователь изменяет данные и хочет обновить изменения в базе данных. Метод обновления аналогичен методу создания и будет использоваться для обновления существующих книг в базе данных.

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

Метод update_attributes аналогичен методу сохранения, используемому командой create, но вместо создания новой строки в базе данных он перезаписывает атрибуты существующей строки.

Затем требуется строка @subjects = Subject.all, если она не удастся успешно сохранить данные, тогда она станет похожей на опцию редактирования.

Реализация метода удаления

Если вы хотите удалить запись из базы данных, вы будете использовать этот метод. Реализуйте этот метод следующим образом.

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

Первая строка находит классификацию на основе параметра, переданного через объект params, а затем удаляет его с помощью метода destroy. Вторая строка перенаправляет пользователя в метод списка с помощью вызова redirect_to.

Дополнительные методы для отображения предметов

Предположим, вы хотите предоставить своим пользователям возможность просматривать все книги по заданному предмету. Таким образом, вы можете создать метод внутри book_controller.rb для отображения всех предметов. Предположим, что имя метода — show_subjects

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

Наконец, ваш файл book_controller.rb будет выглядеть следующим образом:

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

Теперь сохраните ваш файл контроллера.

Что дальше?

Вы создали почти все методы, которые будут работать на бэкэнде. Далее мы определим маршруты (URL) для действий.