Контроллер Rails является логическим центром вашего приложения. Он координирует взаимодействие между пользователем, представлениями и моделью. Контроллер также является домом для ряда важных вспомогательных услуг.
-
Он отвечает за маршрутизацию внешних запросов к внутренним действиям. Он отлично обрабатывает удобные для пользователя URL-адреса.
-
Он управляет кэшированием, что может повысить производительность приложений на порядок.
-
Он управляет вспомогательными модулями, которые расширяют возможности шаблонов представления без увеличения объема их кода.
-
Он управляет сессиями, создавая у пользователей впечатление постоянного взаимодействия с нашими приложениями.
Он отвечает за маршрутизацию внешних запросов к внутренним действиям. Он отлично обрабатывает удобные для пользователя URL-адреса.
Он управляет кэшированием, что может повысить производительность приложений на порядок.
Он управляет вспомогательными модулями, которые расширяют возможности шаблонов представления без увеличения объема их кода.
Он управляет сессиями, создавая у пользователей впечатление постоянного взаимодействия с нашими приложениями.
Процесс создания контроллера очень прост, и он похож на процесс, который мы уже использовали для создания модели. Мы создадим только один контроллер здесь —
C:\ruby\library\> ruby script/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
Теперь давайте реализуем все методы один за другим.
Реализация метода списка
Метод списка дает распечатку всех книг в базе данных. Эта функциональность будет достигнута с помощью следующих строк кода.
def list @books = Book.find(:all) end
Строка @books = Book.find (: all) в методе list указывает Rails искать в таблице книг и сохранять каждую найденную строку в объекте экземпляра @books.
Реализация метода шоу
Метод show отображает только дополнительную информацию об одной книге. Эта функциональность будет достигнута с помощью следующих строк кода.
def show @book = Book.find(params[:id]) end
Строка @books = Book.find (params [: id]) метода show указывает Rails найти только книгу, идентификатор которой определен в params [: id].
Объект params — это контейнер, который позволяет передавать значения между вызовами метода. Например, когда вы находитесь на странице, вызываемой методом list, вы можете щелкнуть ссылку для определенной книги, и она передает идентификатор этой книги через объект params, чтобы show могло найти конкретную книгу.
Внедрение нового метода
Новый метод позволяет Rails знать, что вы создадите новый объект. Просто добавьте следующий код в этот метод.
def new @book = Book.new @subjects = Subject.find(:all) end
Вышеупомянутый метод будет вызван, когда вы отобразите страницу для пользователя, чтобы принять пользовательский ввод. Здесь вторая строка берет все объекты из базы данных и помещает их в массив с именем @subjects.
Реализация метода создания
После того как вы введете пользовательский ввод с помощью формы HTML, самое время создать запись в базе данных. Для этого отредактируйте метод create в book_controller.rb, чтобы он соответствовал следующему:
def create @book = Book.new(params[:book]) if @book.save redirect_to :action => 'list' else @subjects = Subject.find(:all) render :action => 'new' end end
Первая строка создает новую переменную экземпляра с именем @book, которая содержит объект Book, созданный из данных, предоставленных пользователем. Данные были переданы из нового метода для создания с использованием объекта params.
Следующая строка — это условный оператор, который перенаправляет пользователя в метод списка, если объект правильно сохраняется в базе данных. Если он не сохраняется, пользователь возвращается к новому методу. Метод redirect_to похож на выполнение мета-обновления на веб-странице и автоматически перенаправляет вас к месту назначения без какого-либо взаимодействия с пользователем.
Тогда @subjects = Subject.find (: all) требуется в случае, если он не сохраняет данные успешно и становится аналогичным случаю с новой опцией.
Реализация метода редактирования
Метод edit выглядит практически идентично методу show. Оба метода используются для извлечения одного объекта на основе его идентификатора и отображения его на странице. Разница лишь в том, что метод show недоступен для редактирования.
def edit @book = Book.find(params[:id]) @subjects = Subject.find(:all) end
Этот метод будет вызываться для отображения данных на экране, которые будут изменены пользователем. Вторая строка берет все предметы из базы данных и помещает их в массив с именем @subjects.
Реализация метода обновления
Этот метод будет вызываться после метода редактирования, когда пользователь изменяет данные и хочет обновить изменения в базе данных. Метод обновления аналогичен методу создания и будет использоваться для обновления существующих книг в базе данных.
def update @book = Book.find(params[:id]) if @book.update_attributes(params[:book]) redirect_to :action => 'show', :id => @book else @subjects = Subject.find(:all) render :action => 'edit' end end
Метод update_attributes аналогичен методу сохранения, используемому при создании, но вместо создания новой строки в базе данных он перезаписывает атрибуты существующей строки.
Затем требуется строка @subjects = Subject.find (: 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 BookController < ApplicationController def list @books = Book.find(:all) end def show @book = Book.find(params[:id]) end def new @book = Book.new @subjects = Subject.find(:all) end def create @book = Book.new(params[:book]) if @book.save redirect_to :action => 'list' else @subjects = Subject.find(:all) render :action => 'new' end end def edit @book = Book.find(params[:id]) @subjects = Subject.find(:all) end def update @book = Book.find(params[:id]) if @book.update_attributes(params[:book]) redirect_to :action => 'show', :id => @book else @subjects = Subject.find(: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
Теперь сохраните ваш файл контроллера и выйдите для следующего назначения.
Что дальше?
Вы создали почти все методы, которые будут работать на бэкэнде. Далее мы создадим код для генерации экранов для отображения данных и получения ввода от пользователя.