【Rails】발언 기능에 공개/비공개 기능을 추가할 때의 설치 절차

12502 단어 Rails

개시하다


제작된 포트폴리오에 기사의 공개와 비공개 기능이 추가됐기 때문에 설치 절차를 안내한다.
기사를 기고했지만 당분간 비공개할 때가 있을 것 같아 시행해 봤다.

전제 조건

  • kaminari의gem기능을 사용하여 비공개 문장 일람표
  • 획득
  • devise의gem 기능을 사용하여 다른 사용자가 비공개 글에서 방향을 바꿀 수 있도록 한다
  • 버전 정보

  • Ruby 2.6.3
  • Rails 6.0.2.1
  • 설치된 프로그램


    posts표에status용 열을 추가합니다

    $ rails g migration Add_status_To_posts status:integur
    
    db/migrate/20201111213454_add_status_to_posts.rb
    class AddStatusToPosts < ActiveRecord::Migration[6.0]
      def change
        add_column :posts, :status, :integer, null: false, default: 0
      end
    end
    

    모델 정의


    app/models/post.rb
    class Post < ApplicationRecord
    
    #・・・省略
    
      enum status: { public: 0, private: 1 }, _prefix: true
    
    #・・・省略
    
    end
    
    
    위에서 설명한 대로 브라우저를 설명_prefix: true 없이 여는 동안 다음 오류가 발생했습니다.
    잘못된 문장을 확인한 후 public의 방법이 중복되었다.
    오류가 반복되지 않은 경우_prefix: true는 기술할 필요가 없습니다.
    log/development.log
    ArgumentError (You tried to define an enum named "status" on the model "Post", but this will generate a class method "public", which is already defined by Active Record.):
    
    app/models/post.rb:19:in `<class:Post>'
    app/models/post.rb:1:in `<main>'
    app/controllers/posts_controller.rb:85:in `set_post'
    Started GET "/posts/3" for 127.0.0.1 at 2020-11-12 06:52:36 +0900
    Cannot render console from 172.22.0.1! Allowed networks: 127.0.0.0/127.255.255.255, ::1
      [1m[35m (1.2ms)[0m  [1m[35mSET NAMES utf8mb4,  @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'),  @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483[0m
    Processing by PostsController#show as HTML
      Parameters: {"id"=>"3"}
    Completed 500 Internal Server Error in 27ms (ActiveRecord: 0.0ms | Allocations: 5566)
    

    발언 편집 페이지에서 발언 상태 선택 허용


    app/views/posts/_form.html.erb
    <%= form_with(model: post, local: true) do |form| %>
    
    <!--・・・省略・・・-->
    
      <%= form.label(:public, for: nil, class:'post-status__label') do %>
          <%= form.radio_button :status, :public %>
          <%= I18n.t('activerecord.attributes.post.statuses.public') %>
      <% end %>
      <%= form.label(:private, for: nil, class:'post-status__label') do %>
          <%= form.radio_button :status, :private %>
          <%= I18n.t('activerecord.attributes.post.statuses.private') %>
      <% end %>
    
    <!--・・・省略・・・-->
    
    <% end %>
    
    공개 및 비공개 UI를 선택하는 방법은 다음과 같습니다.
    이 글의 실시 절차는 주요 화제가 아니기 때문에 생략하였다.
    그런데 이 설치에 시간이 걸렸어요.

    선택한 상태 저장


    app/controllers/posts_controller.rb
    class PostsController < ApplicationController
    
    # ・・・省略
    
      def create
        @post = Post.new(post_params)
        @post.user_id = current_user.id
    
        respond_to do |format|
          if @post.save
            format.html { redirect_to @post, notice: '新規投稿を行いました。' }
            format.json { render :show, status: :created, location: @post }
          else
            format.html { render :new }
            format.json { render json: @post.errors, status: :unprocessable_entity }
          end
        end
      end
    
    # ・・・省略
    
      private
    
    # ・・・省略
    
        def post_params
          params.require(:post).permit(
            :title,
            :content,
            :image,
            :status, # <= 追加:statusカラム
            {:cat_ids => []}
          )
        end
    
    # ・・・省略
    
    end
    
    
    

    다른 사용자를 방문할 때 비공개 기사 목록 및 상세 페이지 리디렉션


    app/controllers/posts_controller.rb
    class PostsController < ApplicationController
      before_action :set_post, only: [:show, :edit, :update, :destroy]
    
      # GET /posts/1
      # GET /posts/1.json
      def show
    
        if @post.status_private? && @post.user != current_user
          respond_to do |format|
            format.html { redirect_to posts_path, notice: 'このページにはアクセスできません' }
          end
        end
    
        # ・・・省略
      end
    
      # ・・・省略
    
      private
        def set_post
          @post = Post.find(params[:id])
        end
    
        # ・・・省略
    
    end
    
    
    

    글 목록 가져오기 방법

    # 公開記事
    $ Post.status_public.order(created_at: :desc).page(params[:page])
    
    # 非公開記事
    $ Post.status_private.order(created_at: :desc).page(params[:page])
    
    # ランキング(Likeのトップ3)
    $ Post.status_public.joins(:likes).group(:post_id).order('count(likes.post_id) desc').limit(3)
    
    
    

    소요 시간


    작업 내용
    소요 시간
    어림잡다
    0.75H
    실제 설치: 새 투고
    7H
    실제 설치: 사용자 세부 정보 페이지
    2.25H
    실장 검증: 발언 상세 페이지 (localhost/posts/: id)
    1H
    랩 인증: 기사 일람·상세 페이지(Like Ranking)
    0.5H
    실제 설치 검증: 글 일람 (localhost/posts)
    0.125H
    실제 설치: TOP(localhost)
    0.125H
    합계
    12H
    기고문 편집 페이지를 만드는 데 7H가 걸렸기 때문에 반성을 했지만 드디어 만들 수 있어서 정말 다행이다

    최후


    기사의 공개와 비공개 기능이 추가될 때 이 기사를 참고하면 좋겠다.

    참고 자료


    [Rails] enum 튜토리얼
    Rails 5 부터 enum 을 사용할 때접두어suffix 사용하기

    좋은 웹페이지 즐겨찾기