[RUBY] [Rails] Implementierung einer ähnlichen Funktion

Am Anfang

Falls Sie es vergessen, habe ich die Implementierung der ähnlichen Funktion zusammen mit dem Entwurf kurz zusammengefasst.

Annahme

Umgebung Schienen 5.2 Serie Ruby 2.6-Serie

Bibliothek verwendet  devise  Slim

Implementierung

1. Erstellen einer Rails-App

$ cd
$ rails new favorite_function
$ cd favorite_function

2. Einführung von Gem Devise und Slim

Gemfile



gem 'slim-rails'  #Bietet schlanken Generator
gem 'html2slim'  #Konvertiert Dateien im ERB-Format in ein schlankes Format
gem 'devise'
$ bundle

3. Installieren Sie das Gerät

$ rails g devise:install
    create  config/initializers/devise.rb
    create  config/locales/devise.en.yml
===============================================================================

Some setup you must do manually if you haven't yet:

  1. Ensure you have defined default url options in your environments files. Here
     is an example of default_url_options appropriate for a development environment
     in config/environments/development.rb:

       config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

     In production, :host should be set to the actual host of your application.

  2. Ensure you have defined root_url to *something* in your config/routes.rb.
     For example:

       root to: "home#index"

  3. Ensure you have flash messages in app/views/layouts/application.html.erb.
     For example:

       <p class="notice"><%= notice %></p>
       <p class="alert"><%= alert %></p>

  4. You can copy Devise views (for customization) to your app by running:

       rails g devise:views

===============================================================================

4. Bearbeiten Sie gemäß den 4 Anweisungen, die gleichzeitig mit der Installation des Geräts gegeben wurden

4-1. Zuerst

config/environments/development.rb



Rails.application.configure do
.
.
.
  config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
.
.
.
end

4-2. Zweitens

$ rails g controller posts new index show

config/routes.rb



Rails.application.routes.draw do
  root to: 'posts#index'  #Das root möchte ich in der App setzen_URL angeben
  resources :posts
  .
  .
  .
end

4-3. Drittens

ruby:app/views/layouts/application.html.erb



<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>

4-4. Viertens

$ rails g devise:views

invoke  Devise::Generators::SharedViewsGenerator
      create    app/views/devise/shared
      create    app/views/devise/shared/_error_messages.html.erb
      create    app/views/devise/shared/_links.html.erb
      create    app/views/devise/confirmations
      create    app/views/devise/confirmations/new.html.erb
      create    app/views/devise/passwords
      create    app/views/devise/passwords/edit.html.erb
      create    app/views/devise/passwords/new.html.erb
      create    app/views/devise/registrations
      create    app/views/devise/registrations/edit.html.erb
      create    app/views/devise/registrations/new.html.erb
      create    app/views/devise/sessions
      create    app/views/devise/sessions/new.html.erb
      create    app/views/devise/unlocks
      create    app/views/devise/unlocks/new.html.erb
      create    app/views/devise/mailer
      create    app/views/devise/mailer/confirmation_instructions.html.erb
      create    app/views/devise/mailer/email_changed.html.erb
      create    app/views/devise/mailer/password_change.html.erb
      create    app/views/devise/mailer/reset_password_instructions.html.erb
      create    app/views/devise/mailer/unlock_instructions.html.erb

5. Konvertieren Sie nun alle Ansichten in Slim

$ bundle exec erb2slim app/views/ --delete

__ * Wenn Sie das Devise-Verzeichnis in Slim konvertieren, tritt in devise / shared / _error_messages.html.slim ein Fehler auf. Beheben Sie ihn. __ __

ruby:devise/shared/_error_messages.html.slim


- if resource.errors.any?
  #error_explanation
    h2

      #In den folgenden 3 Zeilen tritt ein Fehler auf. Beheben Sie ihn daher wie folgt
      = I18n.t("errors.messages.not_saved",
        count: resource.errors.count,
        resource: resource.class.model_name.human.downcase)

    ul
      - resource.errors.full_messages.each do |message|
        li
          = message

6. Erstellen Sie eine Ansicht des Authentifizierungsmechanismus

ruby:app/views/layouts/application.html.slim



html
  head
  .
  .
  .
  body
    - if user_signed_in?
      =link_to 'Ausloggen', destroy_user_session_path, method: :delete
    - else
      =link_to 'Anmelden', new_user_registration_path
      =link_to 'Einloggen', new_user_session_path
  .
  .
  .

・ Wenn Sie nicht wissen, welcher Pfad zu welcher Aktion führt, überprüfen Sie dies mit dem Befehl Rails Routes.


7. Modell erstellen

$ rails g devise User
$ rails g model Post content:string user:references 
$ rails g model Favorite user:references post:references
$ rails g migration add_columns_to_users username:string

$ rails db:migrate

-``` Benutzer hat mehrere Likes für Post `,` `Post hat auch mehrere Likes von User `` Many-to-many , also mach es zu einem Favoriten Stellen Sie andererseits eine Referenz auf, die angibt, dass sie Eigentum von Post und Benutzer ist.


8. Modellassoziation

8-1. Lieblingsmodell

app/models/favorite.rb


class Favorite < ApplicationRecord
  belongs_to :user
  belongs_to :post
end

8-2. Postmodell

app/models/post.rb


class Post < ApplicationRecord
  belongs_to :user
  has_many :favorites
end

・ Es ist möglich, post.favorites aufzurufen, wenn Likes an Posts angehängt werden. Sie können die Anzahl der Likes mithilfe von post.favorites.count ermitteln.

8-3. Benutzermodell

user.rb


class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  has_many :favorites
  has_many :favorite_posts, through: :favorites, source: :post
  has_many :posts
end

-Es ist möglich, user.favorites aufzurufen, wenn `` `Benutzer Likes``` erhalten.

-``` Wenn Sie Beiträge anzeigen möchten, die Benutzern auf Ihrem Profilbildschirm gefallen, gibt es `. Zu diesem Zeitpunkt können Sie user.favorite_posts aufrufen. Es verwendet die Option through`` und ordnet sie über eine Zwischentabelle dem Post-Modell zu.

-Das in through verwendete Modell ist `` `, das zuerst zugeordnet werden muss. In diesem Fall müssen zuerst Favoriten zugeordnet werden.

has_many :Lieblingsmodellname, through: :Zwischentisch, source: :Der Modellname, der die Referenzquelle des benannten Modells ist



---

### 9. Controller erstellen

$ rails g controller posts new index show #Wird weggelassen, wenn er beim Einstellen des Geräts erstellt wurde $ rails g controller users index show $ rails g controller favorites create destroy


 · (Beiträge,) Benutzer, Favoriten-Controller

---
### 10. Implementierung von Benutzerfunktionen

#### 10-1. Bearbeiten des Routings


#### **`config/routes.rb`**
```ruby


Rails.application.routes.draw do

  resources :users, only: [:index, :show]  #Für Benutzerliste und Profilbildschirm
  devise_for :users  #Für den Anmeldemechanismus

end

10-2 Bearbeiten des Benutzercontrollers

app/controllers/users_controller.rb



class UsersController < ApplicationController

  before_action :authenticate_user!  #Benutzerauthentifizierung von devise

  def index
    @users = User.all
  end

  def show
    @user = User.find(params[:id])
  end
end

10-3 Bearbeiten der Benutzeransicht

● Indexansicht

ruby:app/views/users/index.html.slim


h1 Benutzerliste

- @users.each do |user|
  p
    = link_to user.email, user

● show

ruby:app/views/users/show.html.slim


h1 Benutzerprofilseite

p
  = @user.username
  = @user.email

10-4. Fügen Sie in der Anwendungsansicht einen Link zur Benutzerseite ein

ruby:app/views/layouts/application.html.slim


  body
    - if user_signed_in?
      .
      .
      .
   +  = link_to 'Meine Seite', user_path(current_user)
   +  = link_to 'Benutzerliste', users_path
    - else
      .
      .

11. Implementierung von Buchungsfunktionen

11-1. Bearbeiten des Routings

config/routes.rb


Rails.application.routes.draw do

  resources :users
  devise_for :users

  root to: 'posts#index'  #Geben Sie die Beitragsliste als Stamm an
  resources :posts

end

11-2 Bearbeiten des Post-Controllers

app/controllers/posts_controller.rb


class PostsController < ApplicationController

  def index
    @posts = Post.all
  end

  def new
    @post = Post.new
  end

  def create
    @post = current_user.posts.new(post_params)  # current_Benutzer repräsentiert den von devise bereitgestellten angemeldeten Benutzer
    if @post.save
      redirect_to @post
    end
  end

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

  private
  def post_params
    params.require(:post).permit(:content)
  end
end

・ Wenn ein neuer Beitrag veröffentlicht wird, ist der Eigentümer des erstellten Beitrags der Benutzer, der ihn veröffentlicht hat. Verwenden Sie daher `current_user.posts `. Die user_id in der posts-Tabelle enthält jetzt die ID von current_user. (Beachten Sie, dass diese Methode nur verwendet werden kann, wenn das Benutzermodell und das Post-Modell zugeordnet sind.)

11-3 Bearbeiten der Beitragsansicht

● index

ruby:app/views/posts/index.html.slim


h1 Beitragsliste

- @posts.each do |post|
  p= link_to post.user.email, user_path(post.user.id)
  p= link_to post.content

● new

ruby:app/views/posts/new.html.slim


h2 neuer Beitrag

= form_with model: @post do |f|
  p
    = f.label :content
    = f.text_area :content
  = f.submit 'Post'

● show

ruby:app/views/posts/show.html.slim


h1 Beitragsdetailseite

p= @post.content

11-4. Fügen Sie in der Anwendungsansicht einen Link zur Buchungsseite ein

ruby:app/views/layouts/application.html.slim


  body
    - if user_signed_in?
      .
      .
      .
      = link_to 'Beitragsliste', posts_path
    - else
      .
      .

12. Implementierung einer ähnlichen Funktion

12-1. Erstellen Sie eine Like-Schaltfläche zum Posten

ruby:app/views/posts/index.html.slim


h1 Beitragsliste

- @posts.each do |post|
  p= link_to post.user.email, user_path(post.user.id)
  p= link_to post.content

  - if user_signed_in?  #Eine von devise bereitgestellte Methode, um zu überprüfen, ob der Benutzer angemeldet ist
    - if post.favorited_by?(current_user)
      p= link_to post.favorites.count, post_favorites_path(post.id), method: :delete
    - else
      p= link_to post.favorites.count, post_favorites_path(post.id), method: :post
  - else
    = post.favorites.count

-Verwenden Sie `user_signed_in?` Um `` `nur für den angemeldeten Benutzer sichtbar zu machen.

`Wenn es Ihnen gefällt, möchten Sie den Löschlink des Like anzeigen`, und wenn es Ihnen noch nicht gefallen hat, möchten Sie den Link zum Erstellen des Like`` anzeigen, also ` Überprüfen Sie dies mit der Methode "favorited_by (current_user)".

-Die favored_by (current_user) -Methode wird danach erstellt.

-``` Post.favorites.count zeigt die Anzahl der Likes des Beitrags an.

12-2. Definieren Sie eine Methode, um nach Likes zu suchen

app/models/post.rb


class Post < ApplicationRecord
  belongs_to :user
  has_many :favorites

  
  + def favorited_by?(current_user)
  +   favorites.where(user_id: current_user.id).exists?
  + end
end

-Überprüfen Sie, ob die ID des angemeldeten Benutzers in user_id der `Favoriten-Tabelle vorhanden ist.

-Es wird wie post.favorited_by (current_user) verwendet. Machen wir es uns etwas einfacher

ruby:posts/index.html.slim


h1 Beitragsliste

- @posts.each do |post|
  .
  .
  .
  - if post.favorited_by?(current_user) 
      #Löschlink von Likes anzeigen
  - else
      #Show wie Link erstellen

-Dies zeigt den folgenden Code.

- if post.favorites.where(user_id: current_user.id).exists?
    #Linkanzeige löschen
- else
    #Show wie Link erstellen

-``` Ruft die ID des angemeldeten Benutzers `ab,` `user_id ist die ID des angemeldeten Benutzers aus der Favoritentabelle des erfassten Beitrags und `` prüft, ob es existiert ` »Ich lasse dich.

12-3 Bearbeiten des Routings

config/routes.rb


Rails.application.routes.draw do

  resources :users
  devise_for :users

  root to: 'posts#index'
  resources :posts do
+   resource :favorites, only: [:create, :destroy]
  end

end

-Favoriten sind in Posts verschachtelt. Dies macht es einfacher, einen Pfad anzugeben, der einem Beitrag gefällt, z. B. "post_favorites_path".

12-4 Bearbeiten des Favoriten-Controllers

app/controllers/favorites_controller.rb


class FavoritesController < ApplicationController

  def create
    favorite = current_user.favorites.build(post_id: params[:post_id])
    favorite.save
    redirect_to posts_path
  end

  def destroy
    favorite = Favorite.find_by(post_id: params[:post_id], user_id: current_user.id)
    favorite.destroy
    redirect_to posts_path
  end
end

-``` Speichert die ID des Beitrags, den Sie mögen, `` , `in der Favoriten-Tabelle des angemeldeten Benutzers. Und wenn man es speichert, wird es als Gewährung von Likes angesehen.

12-5 Zeigen Sie auf der Benutzerseite die Beiträge an, die dem Benutzer gefallen haben. Übrigens werden auch die vom Benutzer geposteten Beiträge angezeigt.

● Bearbeiten Sie die Show-Aktion des Benutzer-Controllers

app/controllers/users_controller.rb


class UsersController < ApplicationController

  before_action :authenticate_user!

  def index
    @users = User.all
  end

  def show
    @user = User.find(params[:id])
    @posts = @user.posts
    @favorite_posts = @user.favorite_posts
  end
end

・ In @ posts erhalte ich reguläre Posts, um reguläre Posts anzuzeigen.

・ In @ favourite_posts werden die Beiträge erfasst, die dem Benutzer gefallen. Aus diesem Grund habe ich in app / models / user.rb über die Favoritentabelle eine Verknüpfung mit dem Post-Modell unter dem Namen Favorit_posts hergestellt.

● Bearbeiten Sie show.html.slim

ruby:app/views/users/show.html.slim


h1 Benutzerprofilseite

p
  = @user.username

h3 wie
- @favorite_posts.each do |f_post|
  p
    = f_post.content

h3 post
- @posts.each do |post|
  p
    = post.content

・ Das Obige zeigt Beiträge, die Benutzern gefallen.

・ Unten sehen Sie die von Benutzern geposteten Beiträge.

-Sie können es wie Twitter aussehen lassen, indem Sie per Klick-Ereignis wechseln, aber ich werde es hier nicht tun.

Damit ist die Implementierung der Like-Funktion abgeschlossen.

Artikel, die sehr hilfreich waren

https://qiita.com/kazukimatsumoto/items/14bdff681ec5ddac26d1

Recommended Posts

[Rails] Implementierung einer ähnlichen Funktion
[Rails] Asynchrone Implementierung der Like-Funktion
[Rails] Über die Implementierung der Like-Funktion
[Ruby on Rails] Implementierung einer ähnlichen Funktion
Implementierung einer ähnlichen Funktion (Ajax)
[Rails] Implementierung der Kategoriefunktion
[Rails] Implementierung der Tutorial-Funktion
[Rails] Implementierung der Bildvorschau
Implementierung einer ähnlichen Funktion in Java
Implementierung der Suchfunktion
Implementierung der Rails-Sortierfunktion (angezeigt in der Reihenfolge der Anzahl der Gleichen)
Rails [Für Anfänger] Implementierung der Kommentarfunktion
Implementierung der Pagenationsfunktion
[Rails] Implementierung der Suchfunktion mit Gem's Ransack
Implementierung der Ruby on Rails-Anmeldefunktion (Sitzung)
[Rails] Implementierung der Bildvergrößerungsfunktion mit Lightbox2
Implementierung der Ajax-Entfernung in Rails
Implementierung der Fuzzy-Suchfunktion für Schienen
Implementierung der sequentiellen Suchfunktion
Implementierung der Bildvorschau
Implementierung der Kategorie-Pulldown-Funktion
[Rails] Implementierung der Drag & Drop-Funktion (mit Wirkung)
Implementierung der Ruby on Rails-Anmeldefunktion (Devise Edition)
[Rails] Implementierung einer mehrschichtigen Kategoriefunktion unter Verwendung der Abstammung "Vorbereitung"
[Rails] Implementierung einer mehrschichtigen Kategoriefunktion unter Verwendung der "Seed Edition" der Vorfahren
[Rails] Implementierung des logischen Löschens durch den Benutzer
[Rails] Implementierung von Viele-zu-Viele-Kategoriefunktionen
Implementierung der Funktionsfunktion [Rails] gem ancestry category
[Ruby on Rails] Implementierung der Kommentarfunktion
[Rails] Memo zur Implementierung der Kommentarfunktion
[Rails] Implementierung einer mehrschichtigen Kategoriefunktion unter Verwendung der Abstammung "Erstellungsformular"
[Rails] Hinzufügen der Ruby On Rails-Kommentarfunktion
Ich habe versucht, die Ajax-Verarbeitung der ähnlichen Funktion in Rails zu implementieren
Implementierung der Benutzerauthentifizierungsfunktion mit devise (2)
Implementierung der DM-Funktion
Schienen Hinzufügen einer einfachen Anmeldefunktion
[Rails] [jQuery] Asynchrone Funktionsimplementierung mit remote: true und js.erb
[Ruby on Rails] Folgen Sie der Funktionsimplementierung: Bidirektional
[Schienen] Kategoriefunktion
Implementierung der Benutzerauthentifizierungsfunktion mit devise (1)
[Rails] Implementierung der Couponfunktion (mit automatischer Löschfunktion mittels Stapelverarbeitung)
Schienen folgen der Funktion
Rails Grundgerüst für die Implementierung der CRUD-Funktion
Implementierung der Benutzerauthentifizierungsfunktion mit devise (3)