Контроллер 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) для действий.