Nous avons ajouté la fonction de publication / articles privés au portfolio que nous créons, nous allons donc introduire la procédure de mise en œuvre. J'ai publié un article, mais je pense qu'il y a des moments où je veux le garder privé, alors je l'ai implémenté.
--Utilisez la fonction gem de kaminari pour obtenir une liste d'articles privés --Utilisation de la fonction de gemme de devise pour rediriger d'autres utilisateurs à partir d'articles privés
$ 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
#···réduction
enum status: { public: 0, private: 1 }, _prefix: true
#···réduction
end
Lorsque j'ai ouvert le navigateur sans décrire _prefix: true '' comme décrit ci-dessus, l'erreur suivante s'est produite. En vérifiant la déclaration d'erreur, il est dit que la méthode
public '' est dupliquée.
S'il n'y a pas d'erreurs en double, vous n'avez pas besoin d'écrire
_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)
erb:app/views/posts/_form.html.erb
<%= form_with(model: post, local: true) do |form| %>
<!--···réduction···-->
<%= 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 %>
<!--···réduction···-->
<% end %>
L'interface utilisateur pour sélectionner public / privé est la suivante. La procédure de mise en œuvre n'est pas le sujet principal de cet article, je vais donc l'omettre. Cependant, cette implémentation a pris du temps.
app/controllers/posts_controller.rb
class PostsController < ApplicationController
#···réduction
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: 'J'ai fait un nouveau message.' }
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
#···réduction
private
#···réduction
def post_params
params.require(:post).permit(
:title,
:content,
:image,
:status, # <=Ajouté: colonne d'état
{:cat_ids => []}
)
end
#···réduction
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: 'Cette page n'est pas accessible' }
end
end
#···réduction
end
#···réduction
private
def set_post
@post = Post.find(params[:id])
end
#···réduction
end
#Article public
$ Post.status_public.order(created_at: :desc).page(params[:page])
#Article privé
$ Post.status_private.order(created_at: :desc).page(params[:page])
#Classement(Top 3 des J'aime)
$ Post.status_public.joins(:likes).group(:post_id).order('count(likes.post_id) desc').limit(3)
Le contenu du travail | Temps requis |
---|---|
Estimations | 0.75H |
Mise en œuvre / vérification: nouveau poste | 7H |
Mise en œuvre / vérification: page de détails de l'utilisateur | 2.25H |
Mise en œuvre / vérification: page Détails de l'article(localhost/posts/:id) | 1H |
Mise en œuvre / vérification: liste d'articles / page de détail(Like Ranking) | 0.5H |
Mise en œuvre / vérification: liste d'articles(localhost/posts) | 0.125H |
Mise en œuvre / vérification: TOP(localhost) | 0.125H |
total | 12H |
Il m'a fallu 7 heures pour créer la page d'édition des articles, donc je le regrette, mais je suis content d'avoir réussi à la créer.
Nous espérons que cet article vous sera utile lors de l'ajout de fonctions publiques / privées à l'article.
[Rails] enum tutorial Utilisez _prefix (prefix) _suffix (suffix) lors de l'utilisation de l'énumération de Rails5