Skip to main content

Ruby on Rails — Создание простого приложения. Часть 1

И так, мы с вами уже научились устанавливать Ruby on Rails, разобрали самые базовые команды для создания контроллеров и моделей. А сегодня создадим простое приложение, с помощью которого мы сможем разобрать и понять основы работы в Rails. Сложное приложение мы делать не будем, создадим простое To-do приложение со списком задач, а в будущем будем добавлять новый функционал. Все создают менеджеры задач, почему бы и нам не сделать 🙂

Создаем наше приложение командой rails new TodoApp и переходим в появившуюся папку TodoApp, запускаем команду bundle install.
Приложение создано, теперь нам нужно сделать хоть минимальное описание функций, чтобы хоть минимально понимать принцип работы нашего приложения.

И так, с помощью TodoApp мы сможем:

  • Добавлять, удалять, редактировать заметки
  • Отмечать о выполнении
  • Отображать только выполненные или невыполненные задачи

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

Создание модели

Модель — это то, как объект будет выглядеть в базе данных, какие поля будет иметь и как они будут называться. Создадим модель task с полями title, text, status: rails g model task title:string text:text status:boolean.
Откроем файл в директории db/migrate и добавим к полю status значение по умолчанию — 0.

class CreateTasks < ActiveRecord::Migration
  def change
    create_table :tasks do |t|
      t.string :title
      t.text :text
      t.boolean :status, default: 0

      t.timestamps null: false
    end
  end
end

Модель готова, теперь нужно перенести модель в базу, выполняем: rake db:migrate. Миграция создается автоматически при создании модели, а предыдущая команда применяет все настройки в базе — создание таблиц и полей ориентируясь указаниям описанным в файлах которые расположены в директории db/migrate.

Контроллер и представления

Контроллер нужен для того, чтобы обработать запрос пользователя, выбрать нужные данные и передать их через представление пользователю. Создание контроллера выполняется командой: rails g controller Tasks. Эта команда создаст файл контроллера app/controllers/tasks_controller.rb, в котором мы и будем описывать различные действия. Каждый метод объявленный в этом файле соответствует конкретному представлению.

Поэтому первым делом мы объявим корневое представление, та страничка, которую пользователь увидит зайдя на сайт. Открываем папку app/views/tasks и создаем в ней файл index.html.erb. Запишем в этот файл какой-то текст, не важно, для теста нам хватит. Открываем файл контроллера и объявляем метод с именем index.

Приведя файл к виду:

class TasksController < ApplicationController
  def index
  end
end

Файлы созданы, метод есть, однако страница сама не отобразится после того как вы откроете сайт, приложению еще нужно указать какое представление использовать в качестве главной страницы. Откроем файл config/routes.rb и приводим к виду:

Rails.application.routes.draw do
  root 'tasks#index'
end

Тут все предельно просто, root— говорит нам, что данное представление будет использоваться как главная страница и пользователи при заходе на сайт будут видеть её. Tasks — это контроллер и index — это метод контроллера.

Запускаем сервер командой — rails s и открываем url http://localhost:3000/. У вас должна появится страничка с текстом который вы указали в файле app/views/tasks/index.html.erb, если конечно все сделали правильно 🙂

Создание формы

Форма для добавления у нас будет очень простой, имеет 2 поля, это Title и Text. Поскольку почти все действия у нас будут происходить на главной странице, поэтому форму мы добавим в файл index.html.erb.

<%= form_for @task do |f| %>
    <%= f.text_field :title %>
    <%= f.text_area :text, size: "40x8" %>
    <%= f.submit "Add Task" %>
<% end %>

В файле контроллера, отредактируем метод index приведя к такому виду:

def index
    @task = Task.new
end

Этим мы создадим и поместим объект нашей задачи в переменную и сможем в дальнейшем работать с ней.

Добавляем строчку в файл config/routes.rb:

resources :tasks

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

Перезагрузим страницу и увидим форму, однако добавлять данные в базу она еще не может, для этого нам потребуется создать пару методов в контроллере.

Добавление заметок

Чтобы с помощью нашей формы мы могли добавлять новые задачи, в контроллере tasks нужно создать пару методов. Приводим файл app/controllers/tasks_controller.rb к следующему виду:

class TasksController < ApplicationController
    def index
        @task = Task.new
        @tasks = Task.all
    end
    
    def create
       @task = Task.new(tasks_params)
       if @task.save
           redirect_to root_path
       else
           redirect_to root_path
       end
       
    end
    
    private
        def tasks_params
            params.require(:task).permit(:title, :text)
        end
end

Метод create отвечает за сохранение данных полученных из формы в базу. Приватный метод tasks_params указывает какие параметры(поля формы) разрешены для добавления/изменения. Другими словами, при попытке передачи параметра которого нет в списке permit(). При успешном сохранении мы можем вывести на странице сообщение, однако это нам пока не нужно. Теперь задачи могут быть записаны в базу.

Как вы заметили, в методе index я добавил строчку @tasks = Task.all. Она нужна для отображения всех задач на этой странице, если вы хотите все задачи отображать в другом месте, нужно будет добавить такую строку в другой метод контроллера.

Отображение задач

Откройте файл app/views/tasks/index.html.erb и добавьте следующее:

<% @tasks.each do |t| %>
    <%= t.title %>
    <%= t.text %>
<% end %>

Самый простой вывод информации, оформлением мы заниматься не будем, это вы сможете сделать сами 🙂 В цикле просто выводим название и текст заметки.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *