В этой статье мы собираемся создать CRUD-приложение в Rails 7.

Мы собираемся использовать Rails 7.0.4.2 и Ruby 3.1.0 для этого проекта.

Вопросы для обсуждения

  • Что такое КРУД?
  • Создайте новое приложение для рельсов
  • Создать модель
  • Создать контроллер
  • Создать CRUD
  • Скриншоты
  • Рекомендации

Что такое КРУД?

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

Rails по умолчанию использует базу данных SQLite.

Создайте новое приложение для рельсов

чтобы создать новый тип приложения rails,

rails new Employee_CRUD

Создать модель

rails g model Employee employee_name gender hobbies

он будет создавать и вызывать такие файлы

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

class CreateEmployees < ActiveRecord::Migration[7.0]
  def change
    create_table :employees do |t|
      t.string :employee_name
      t.string :gender
      t.string :hobbies

      t.timestamps
    end
  end
end

Выполнить rails db:migrate . он запустит указанный выше файл миграции.

Создать контроллер

Теперь беги

rails g controller employees index new create show edit update destroy

Он создаст контроллер, а именно employees_controller.rb.

Помимо этого контроллера, эта команда также создает файлы представлений внутри папки представлений и определяет некоторые маршруты в файле routes.rb.

Он создаст 7 представлений файла, когда мы введем index, new, create, show, edit, update и destroy в команде.

→ index.html.erb

→ новый.html.erb

→ создать.html.erb

→ показать.html.erb

→ редактировать.html.erb

→ update.html.erb

→ уничтожить.html.erb

А в config/routes.rb это выглядит так

Rails.application.routes.draw do
  get 'employees/index'
  get 'employees/new'
  get 'employees/create'
  get 'employees/show'
  get 'employees/edit'
  get 'employees/update'
  get 'employees/destroy'
end

Запустите сервер rails с помощью rails s и перейдите по адресу http://localhost:3000/ в вашем браузере. это будет выглядеть,

введите http://localhost:3000/employees/index в адресной строке, чтобы перейти на индексную страницу. это будет выглядеть

СОЗДАТЬ CRUD

Итак, теперь, когда наша модель, представление и контроллер сгенерированы, мы можем написать код для CRUD внутри этих файлов.

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

config/routes.rb

Rails.application.routes.draw do
  resources :employees
  root "employees#index"
end

Давайте теперь перейдем к контроллеру и напишем следующий код:

employees_controller.rb

class EmployeesController < ApplicationController
  before_action :set_employee_params, only: %i[show edit update destroy]

  def index
    @employees = Employee.all
  end

  def new
    @employee = Employee.new
  end

  def create
    @employee = Employee.create(employee_params)
    if @employee.valid?
      flash[:errors] = 'Employee Created Successfully'
      redirect_to employees_path
    else
      flash[:errors] = @employee.errors.full_messages
      render :new
    end
  end

  def show; end

  def edit; end

  def update
    if @employee.update(employee_params)
      flash[:errors] = 'Employee Updated Successfully'
      redirect_to employee_path(@employee)
    else
      flash[:errors] = @employee.errors.full_messages
      redirect_to edit_employee_path
    end
  end

  def destroy
    if @employee.delete
      flash[:errors] = 'Employee Deleted Successfully'
      redirect_to root_path(@employee)
    else
      flash[:errors] = @employee.errors.full_messages
      redirect_to destroy_employee_path
    end
  end

  private

  def set_employee_params
    @employee = Employee.find(params[:id])
  end

  def employee_params
    params.require(:employee).permit(:employee_name, :gender, { hobbies: [] })
  end
end

Теперь давайте изменим файлы представления.

Я собираюсь создать CRUD с некоторыми стилями, и я буду использовать для этого Bootstrap.

Добавьте следующий CDN Bootstrap 5 в application.html.erb

<!--Bootstrap CDN  -->
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<!-- JavaScript Bundle with Popper -->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>

application.html.erb

<!DOCTYPE html>
<html>
  <head>
    <title>EmployeeCrud</title>
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
    <%= javascript_importmap_tags %>
  </head>
   <!--Bootstrap CDN  -->
  <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
  <!-- JavaScript Bundle with Popper -->
  <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>

  <body>
    <%= yield %>
  </body>
</html>

ПРИМЕЧАНИЕ.Нам не нужно создавать, обновлять или уничтожать файлы erb. Поскольку создание — это то же самое, что и новое, обновление — это то же самое, что и редактирование, а уничтожение запускается напрямую с помощью метода, определенного в контроллере. Поэтому вы можете удалить его.

index.html.erb

<div class="flex-column" style = "height: auto;">
  <h1> Employees </h1>
  <!--Error Message-->
  <% if flash[:errors] %>
    <% flash.each do |name,message| %>
      <p class="text-danger"><%= message%></p>
    <% end %>
  <% end %>
  <!-- Employee Table -->
  <div>
    <table class="table table-info table-striped">
      <ol class="fs-2">
        <thead class="table-secondary">
          <td class="text-center"> Id </td>
          <td class="text-center"> Name </td>
          <td class="text-center"> Hobbies </td>
          <td colspan=3 class="text-center"> Action </td>
        </thead>
        <% @employees.each do |e| %>
          <tr>
            <td class="text-center"> <%= e.id %> </td>
            <td class="text-center"> <%= link_to e.employee_name, employee_path(e) %> </td>
            <td class="text-center"> <%= e.hobbies %> </td>
            <td class="text-center"><%= button_to "Show",employee_path(e),method: :get, class:"btn-success border-0 rounded-pill shadow px-3 py-2" %></td>
            <td class="text-center"><%= button_to "Edit",edit_employee_path(e),method: :get, class:"btn-primary border-0 rounded-pill shadow px-3 py-2" %></td>
            <td class="text-center"><%= button_to "Delete",employee_path(e),method: :delete, class:"btn-danger border-0 rounded-pill shadow px-3 py-2" %></td>
          </tr>
        <% end %>
      </ol>
    </table>
  </div>
  <div class="d-flex">
    <%= button_to "Add New Employee", new_employee_path, method: :get ,class:"btn-warning border-0 rounded-pill shadow p-3 m-3" %>
  </div>
</div>

новый.html.erb

<div class="flex-column">
  <div class="card shadow" style="width: 36rem;">
    <div class="card-header">
      <h2 class="text-center">Employee Form</h2>
    </div>
    <div class="card-body">
      <!--Error Message-->
      <% if flash[:errors] %>
        <% flash[:errors].each do |error| %>
          <p class="text-danger"><%= error %></p>
        <% end %>
      <% end %>
      <!-- Form Started Here -->
      <%= form_with model: @employee do |f| %>
        <%= f.label :employee_name, "Employee Name :", class:"mt-3" %>
        <%= f.text_field :employee_name ,placeholder: "Enter Employee's Name",class:"mb-2 form-control" %>
        <br>
        <!-- Radio Button For Gender -->
        <div class="form-group">
          <%= f.label "Gender :" %>
          <%= f.radio_button :gender, "male" %>
          <%= f.label :gender, "Male" %>
          <%= f.radio_button :gender, "female" %>
          <%= f.label :gender, "Female" %>
        </div>
        <br>
        <!-- Checkbox For Hobbies -->
        <div class="form-group">
          <%= f.label "Hobbies :" %>
          <%= f.check_box :hobbies, { multiple: true },"Reading", false %>
          <%= f.label :hobbies, "Reading" %>
          <%= f.check_box :hobbies, { multiple: true },"Photography", false %>
          <%= f.label :hobbies, "Photography" %>
          <%= f.check_box :hobbies, { multiple: true },"Travelling", false %>
          <%= f.label :hobbies, "Travelling" %>
        </div>
        <br>
        <%= f.submit "Save Employee", class:"btn-primary border-0 rounded-pill shadow p-3" %>
      <% end %>
    </div>
  </div>
</div>

edit.html.erb

<div class="flex-column">
  <div class="card shadow" style="width: 36rem;">
    <div class="card-header">
      <h2 class="text-center">Employee Form</h2>
    </div>
    <div class="card-body">
      <!--Error Message-->
      <% if flash[:errors] %>
        <% flash[:errors].each do |error| %>
          <p class="text-danger"><%= error %></p>
        <% end %>
      <% end %>
      <!-- Form Started Here -->
      <%= form_with model: @employee do |f| %>
        <%= f.label :employee_name, "Employee Name :", class:"mt-3" %>
        <%= f.text_field :employee_name ,placeholder: "Enter Employee's Name",class:"mb-2 form-control" %>
        <br>
        <!-- Radio Button For Gender -->
        <div class="form-group">
          <%= f.label "Gender :" %>
          <%= f.radio_button :gender, "male" %>
          <%= f.label :gender, "Male" %>
          <%= f.radio_button :gender, "female" %>
          <%= f.label :gender, "Female" %>
        </div>
        <br>
        <!-- Checkbox For Hobbies -->
        <div class="form-group">
          <%= f.label "Hobbies :" %>
          <%= f.check_box :hobbies, { multiple: true },"Reading", false %>
          <%= f.label :hobbies, "Reading" %>
          <%= f.check_box :hobbies, { multiple: true },"Photography", false %>
          <%= f.label :hobbies, "Photography" %>
          <%= f.check_box :hobbies, { multiple: true },"Travelling", false %>
          <%= f.label :hobbies, "Travelling" %>
        </div>
        <br>
        <%= f.submit "Save Employee", class:"btn-primary border-0 rounded-pill shadow p-3" %>
      <% end %>
    </div>
  </div>
</div>

Примечание. У нас один и тот же код в new.html.erb и edit.html.erb, поэтому мы будем использовать для этого партиал _form.html.erb и просто визуализировать его. частично в наших файлах. Мы сделаем это после того, как узнаем о Rails Partials в наших следующих статьях.

show.html.erb

<!-- Employee Details Showing -->
<div class="flex-column" style="height:100vh;">
  <!--Error Message-->
  <% if flash[:errors] %>
    <% flash.each do |name,message| %>
      <p class="text-danger"><%= message%></p>
    <% end %>
  <% end %>
  <div class="d-flex">
    <div class="m-5" >
      <div class="card bg-light border-warning shadow">
        <div class="card-body">
          <div class="card-header">
            <h2 class="text-center">Employee's Details</h2>
          </div>
          <div>
            <h2> &#10145; ID: <%= @employee.id %> </h2>
            <h2> &#10145; Name: <%= @employee.employee_name %> </h2>
            <h2> &#10145; Gender: <%= @employee.gender %> </h2>
            <h2> &#10145; Hobbies: <%= @employee.hobbies %> </h2>
          </div>
          <div class="d-flex">
            <%= button_to "Edit Employee" , edit_employee_path, method: :get ,class:"btn-success border-0 rounded-pill shadow p-2 m-2" %>
            <%= button_to "Delete Employee", employee_path, method: :delete ,class:"btn-danger border-0 rounded-pill shadow p-2 m-2" %>
            <%= button_to "View all Employee", employees_path,method: :get ,class:"btn-primary border-0 rounded-pill shadow p-2 m-2" %>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

Вот и все. Наш CRUD готов. 🎉 🎉

Теперь просто перейдите по адресу http://localhost:3000/. и наслаждайтесь своим CRUD-приложением.

Скриншоты:

Главная страница

Новая страница

Показать страницу

Редактировать страницу

Кроме того, если вы хотите изменить некоторые стили в своем приложении, вы можете это сделать.

Вам просто нужно создать файл custom.css в папке app/assets/stylesheets и написать свой собственный стиль. Я создаю то же самое и добавляю стили для центрирования div.

пользовательский.css

.set-center {
  height: 100vh;
  display: flex;
  justify-content: center;
  align-items: center;
}

Использованная литература :

Репозиторий GitHub: https://github.com/rutikkpatel/Employee-CRUD-Rails-7