Учебники

Ruby on Rails 2.1 – Контроллеры

Контроллер 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

Теперь сохраните ваш файл контроллера и выйдите для следующего назначения.

Что дальше?

Вы создали почти все методы, которые будут работать на бэкэнде. Далее мы создадим код для генерации экранов для отображения данных и получения ввода от пользователя.