【Rails】발언 기능에 공개/비공개 기능을 추가할 때의 설치 절차
12502 단어 Rails
개시하다
제작된 포트폴리오에 기사의 공개와 비공개 기능이 추가됐기 때문에 설치 절차를 안내한다.
기사를 기고했지만 당분간 비공개할 때가 있을 것 같아 시행해 봤다.
전제 조건
버전 정보
설치된 프로그램
posts표에status용 열을 추가합니다
$ rails g migration Add_status_To_posts status:integur
db/migrate/20201111213454_add_status_to_posts.rbclass AddStatusToPosts < ActiveRecord::Migration[6.0]
def change
add_column :posts, :status, :integer, null: false, default: 0
end
end
모델 정의
app/models/post.rbclass Post < ApplicationRecord
#・・・省略
enum status: { public: 0, private: 1 }, _prefix: true
#・・・省略
end
위에서 설명한 대로 브라우저를 설명_prefix: true
없이 여는 동안 다음 오류가 발생했습니다.
잘못된 문장을 확인한 후 public
의 방법이 중복되었다.
오류가 반복되지 않은 경우_prefix: true
는 기술할 필요가 없습니다.
log/development.logArgumentError (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.rbclass 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.rbclass 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 사용하기
Reference
이 문제에 관하여(【Rails】발언 기능에 공개/비공개 기능을 추가할 때의 설치 절차), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/jungissei/items/d90bd0a62e8110197de0
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
$ rails g migration Add_status_To_posts status:integur
class AddStatusToPosts < ActiveRecord::Migration[6.0]
def change
add_column :posts, :status, :integer, null: false, default: 0
end
end
class Post < ApplicationRecord
#・・・省略
enum status: { public: 0, private: 1 }, _prefix: true
#・・・省略
end
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)
<%= 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 %>
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
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 사용하기
Reference
이 문제에 관하여(【Rails】발언 기능에 공개/비공개 기능을 추가할 때의 설치 절차), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/jungissei/items/d90bd0a62e8110197de0
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
[Rails] enum 튜토리얼
Rails 5 부터 enum 을 사용할 때접두어suffix 사용하기
Reference
이 문제에 관하여(【Rails】발언 기능에 공개/비공개 기능을 추가할 때의 설치 절차), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/jungissei/items/d90bd0a62e8110197de0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)