[Rails] Implementierungsverfahren, wenn der Buchungsfunktion öffentliche / private Funktionen hinzugefügt werden

Einführung

Wir haben dem Portfolio, das wir erstellen, die Funktion des Publizierens / privater Artikel hinzugefügt, daher werden wir das Implementierungsverfahren einführen. Ich habe einen Artikel gepostet, aber ich denke, es gibt Zeiten, in denen ich ihn privat halten möchte, also habe ich ihn implementiert.

Annahme

Versionsinformation

$ 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

Hinzufügen einer Spalte für den Status zur Beitragstabelle Definieren eines Modells ... Ausgelassen ... Ausgelassen Wenn Sie den Browser öffnen, ohne wie oben beschrieben `_prefix: true``` zu schreiben, wird der folgende Fehler angezeigt. Es war. Bei der Überprüfung der Fehleranweisung wird gesagt, dass die Methode public``` dupliziert ist. Wenn keine doppelten Fehler vorliegen, müssen Sie kein `` _prefix: true``` schreiben.

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)

Ermöglicht die Auswahl des Post-Status auf der Post-Bearbeitungsseite

erb:app/views/posts/_form.html.erb


<%= form_with(model: post, local: true) do |form| %>

<!--···Kürzung···-->

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

<!--···Kürzung···-->

<% end %>

Die Benutzeroberfläche für die Auswahl von öffentlich / privat lautet wie folgt. Das Implementierungsverfahren ist nicht das Hauptthema in diesem Artikel, daher werde ich es weglassen. Diese Implementierung dauerte jedoch lange.

post_status.gif

Ermöglicht das Speichern des ausgewählten Beitragsstatus

app/controllers/posts_controller.rb


class PostsController < ApplicationController

#···Kürzung

  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: 'Ich habe einen neuen Beitrag gemacht.' }
        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

#···Kürzung

  private

#···Kürzung

    def post_params
      params.require(:post).permit(
        :title,
        :content,
        :image,
        :status, # <=Hinzugefügt: Statusspalte
        {:cat_ids => []}
      )
    end

#···Kürzung

end


Private Artikelliste und Detailseite werden umgeleitet, wenn andere Benutzer darauf zugreifen

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: 'Auf diese Seite kann nicht zugegriffen werden' }
      end
    end

    #···Kürzung
  end

  #···Kürzung

  private
    def set_post
      @post = Post.find(params[:id])
    end

    #···Kürzung

end


So erhalten Sie die Artikelliste

#Öffentlicher Artikel
$ Post.status_public.order(created_at: :desc).page(params[:page])

#Privater Artikel
$ Post.status_private.order(created_at: :desc).page(params[:page])

#Rangfolge(Top 3 von Like)
$ Post.status_public.joins(:likes).group(:post_id).order('count(likes.post_id) desc').limit(3)


Benötigte Zeit

Arbeitsinhalt Benötigte Zeit
Schätzungen 0.75H
Implementierung / Überprüfung: Neuer Beitrag 7H
Implementierung / Überprüfung: Benutzerdetailseite 2.25H
Implementierung / Überprüfung: Post Details Seite(localhost/posts/:id) 1H
Implementierung / Überprüfung: Artikelliste / Detailseite(Like Ranking) 0.5H
Implementierung / Überprüfung: Artikelliste(localhost/posts) 0.125H
Implementierung / Verifikation: TOP(localhost) 0.125H
gesamt 12H

Ich habe 7 Stunden gebraucht, um die Post-Edit-Seite zu erstellen, daher bereue ich es, aber ich bin froh, dass ich es geschafft habe, sie zu erstellen.

schließlich

Wir hoffen, dass dieser Artikel hilfreich ist, wenn Sie dem Artikel öffentliche / private Funktionen hinzufügen.

Referenz

[Rails] enum tutorial Verwenden Sie _prefix (Präfix) _suffix (Suffix), wenn Sie enum von Rails5 verwenden

Recommended Posts

[Rails] Implementierungsverfahren, wenn der Buchungsfunktion öffentliche / private Funktionen hinzugefügt werden
[Rails] Memo zur Implementierung der Kommentarfunktion
[Rails] Ich werde die Prozedur zum Implementieren der Follow-Funktion mit form_with erklären.
Strict_loading-Funktion zur Unterdrückung des Auftretens von N + 1-Problemen, die von Schienen hinzugefügt wurden 6.1
Rails Grundgerüst für die Implementierung der CRUD-Funktion
[Rails] Implementierungsverfahren der Funktion zum Markieren von Posts ohne Gem + die Funktion zum Eingrenzen und Anzeigen von Posts nach Tags
[Rails6] So verbinden Sie die von Scaffold generierte Buchungsfunktion mit der von devise generierten Benutzerfunktion
[Ruby on Rails] Implementierung einer Validierung, die nur funktioniert, wenn die Bedingungen erfüllt sind
[Schienen] gem'payjp'implementierungsverfahren
Wenn ein Anfänger eine persönliche App mit Schienen erstellt, muss das Verfahren trotzdem zum Startpunkt gebracht werden.