【Rails】투고 카테고리 기능(메모)

목표


  • 카테고리 기능 구현

  • 환경


  • Rails: 6.1.3
  • ruby: 3.0.0
  • mac: OS

  • 전제


  • 간단한 ToDoApp
  • 게시 기능 구현

  • 구현



    category 모델링



    터미널
    $ rails g model Category name:string
    

    마이그레이션 파일 생성.
    class CreateCategories < ActiveRecord::Migration[6.1]
      def change
        create_table :categories do |t|
          t.string :name
    
          t.timestamps
        end
      end
    end
    
    $ rails db:migrate
    

    post 테이블에 카테고리 열 추가



    터미널
    $ rails g migration AddCategoryIdToPosts category_id: integer
    

    마이그레이션 파일 생성.
    class AddCategoryIdToPosts < ActiveRecord::Migration[6.1]
      def change
        add_column :posts, :category_id, :integer
      end
    end
    

    터미널
    $ rails db:migrate
    

    모델 연관(연결)


    post에는 여러 범주가 있으므로 has_many :categories
    app/models/post.rb
    class Post < ApplicationRecord
      has_many :categories
    

    카테고리가 하나의 게시물에 속하기 때문에 belongs_to :post
    app/models/category.rb
    class Category < ApplicationRecord
       belongs_to :post
    

    라우팅 설명



    config.routes.rb
    Rails.application.routes.draw do
       resources :categories
    end
    

    category 컨트롤러 작성



    터미널
    $ rails g controller categories 
    

    생성된 컨트롤러에 설명.

    app/controllers/categories_controller.rb
    class CategoriesController < ApplicationController
    
      def index
        @categories = Category.all
      end
    
      def create
        @category = Category.new(category_params)
        @category.save
      end
    end
    
    private
    
    def category_params
      params.require(:category).permit(:name)
    end
    

    app/controllers/posts_controller.rb
    private
    
    def post_params
      params.require(:post).permit(:content, :title, :category_id)
    end
    

    뷰 설명



    카테고리를 추가할 수 있는 양식입니다.

    app/views/categories/new.html.erb
    <h2>カテゴリの追加 </h2>
     <%= form_with model: @category, local: true do |f| %>
        <div class='from_input'>
          <%= f.label :name %>
          <%= f.text_field :name %>
        </div>
        <div class="form_action">
          <%= f.submit "登録する", class: "btn btn-primary" %>
        </div>
     <% end %>
    
    




    추가한 카테고리를 확인할 수 있습니다.

    app/views/categories/index.html.erb
    <h1>カテゴリ一覧</h1>
      <table class="table table-hover">
        <tbody>
          <% @categories.each do |cate| %>
            <tr>
              <td><%= link_to cate.name, posts_path(category_id: cate.id) %></td>
              <td><%= cate.created_at.to_s(:datetime_jp) %>作成</td>
            </tr>
          <% end %>
        </tbody>
      </table>
    




    새로운 게시물을 만들 때 카테고리를 선택할 수 있도록 양식에 추가.

    app/views/posts/new.html.erb
    
        <h2>投稿ページ</h2>
    
        <%= form_with model: @post do |f| %>
            <div class="form-input">
                <%= f.label :title, 'タイトル' %>
                <%= f.text_field :title, class: "form-control" %>
            </div>
            <div class="form_input">
                <%= f.label :content, '本文' %>
                <%= f.text_field :content, class: "form-control" %>
            </div>
    
            <div class="form_input">
                <%= f.label :category_id %>
    
                <%= f.collection_select :category_id, Category.all, :id, :name, { prompt: '選択してください' }, class: 'form-control' %>
            </div>
            <div class="form_action row">
                <%= f.submit "投稿する", class: "btn btn-primary"%>
            </div>
        <% end %>
    




    이제 카테고리를 선택할 수 있습니다.

    요약



    앞으로도 사용할 가능성이 있는 기능이라고 생각하므로 비망록으로 남겨 둡니다.

    좋은 웹페이지 즐겨찾기