[Rails] Procédure de mise en œuvre lorsque des fonctions publiques / privées sont ajoutées à la fonction de publication

introduction

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é.

supposition

--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

information sur la version

Procédure mise en œuvre

Ajout d'une colonne pour le statut à la table des publications

$ 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

Définir le modèle

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
   (1.2ms)  SET 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
Processing by PostsController#show as HTML
  Parameters: {"id"=>"3"}
Completed 500 Internal Server Error in 27ms (ActiveRecord: 0.0ms | Allocations: 5566)

Vous permet de sélectionner le statut de l'article sur la page de modification de l'article

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.

post_status.gif

Vous permet d'enregistrer le statut de publication sélectionné

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


La liste d'articles privés et la page de détail sont redirigées lorsqu'elles y accèdent par d'autres utilisateurs

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


Comment obtenir la liste d'articles

#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)


Temps requis

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.

enfin

Nous espérons que cet article vous sera utile lors de l'ajout de fonctions publiques / privées à l'article.

référence

[Rails] enum tutorial Utilisez _prefix (prefix) _suffix (suffix) lors de l'utilisation de l'énumération de Rails5

Recommended Posts

[Rails] Procédure de mise en œuvre lorsque des fonctions publiques / privées sont ajoutées à la fonction de publication
[Rails] Commentaire mémo de procédure d'implémentation
[Rails] Je vais expliquer la procédure d'implémentation de la fonction follow en utilisant form_with.
Fonction Strict_loading pour supprimer l'occurrence de problème N + 1 ajoutée à partir des rails 6.1
Échafaudage de procédure d'implémentation de fonction CRUD de base
[Rails] Procédure d'implémentation de la fonction pour taguer les posts sans gem + la fonction pour affiner et afficher les posts par tags
[Rails6] Comment connecter la fonction d'affichage générée par Scaffold avec la fonction utilisateur générée par devise
[Ruby on Rails] Implémentation de la validation qui ne fonctionne que lorsque les conditions sont remplies
[rails] gem'payjp'implementation procedure
Lorsqu'un débutant crée une application personnelle avec des rails, la procédure pour l'amener au point de départ de toute façon.