[RUBY] [Rails] Implémentation d'une fonction similaire

Au début

Au cas où vous l'oublieriez, j'ai brièvement résumé la mise en œuvre de la fonction similaire avec la conception.

supposition

environnement Série Rails 5.2 Série Ruby 2.6

Bibliothèque utilisée  devise  Slim

la mise en oeuvre

1. Création d'une application Rails

$ cd
$ rails new favorite_function
$ cd favorite_function

2. Présentation de gemme et Slim

Gemfile



gem 'slim-rails'  #Fournit un générateur Slim
gem 'html2slim'  #Convertit les fichiers au format ERB au format Slim
gem 'devise'
$ bundle

3. Installez l'appareil

$ 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. Modifiez selon les 4 instructions données en même temps que l'installation de l'appareil

4-1. Premièrement

config/environments/development.rb



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

4-2. Deuxième

$ rails g controller posts new index show

config/routes.rb



Rails.application.routes.draw do
  root to: 'posts#index'  #La racine que je souhaite définir dans l'application_Spécifiez l'URL
  resources :posts
  .
  .
  .
end

4-3. Troisième

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



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

4-4. Quatrième

$ 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. Convertissez maintenant toutes les vues en Slim

$ bundle exec erb2slim app/views/ --delete

__ * Concernant le répertoire de devise, si vous le convertissez en Slim, une erreur se produira dans devise / shared / _error_messages.html.slim, donc corrigez-le. __

ruby:devise/shared/_error_messages.html.slim


- if resource.errors.any?
  #error_explanation
    h2

      #Une erreur se produit dans les 3 lignes suivantes, donc corrigez-la comme suit
      = 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. Créez une vue du mécanisme d'authentification

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



html
  head
  .
  .
  .
  body
    - if user_signed_in?
      =link_to 'Se déconnecter', destroy_user_session_path, method: :delete
    - else
      =link_to 's'inscrire', new_user_registration_path
      =link_to 'S'identifier', new_user_session_path
  .
  .
  .

・ Si vous ne savez pas quel chemin mène à quelle action dans le dispositif, vérifiez avec la commande rails routes.


7. Création d'un modèle

$ 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

-En définissant `` nom du modèle: références '', la clé étrangère est automatiquement définie dans le fichier de migration et l'association est également effectuée dans le fichier de modèle.

-Depuis que ```User et Post ont une relation un-à-plusieurs `` `, une référence indiquant que l'utilisateur est propriétaire du Post est définie.

-```User a plusieurs likes pour Post ``, `` Post a également plusieurs likes de User many-to-many` , donc dans Favorite D'autre part, mettez en place une référence indiquant qu'il appartient à la poste et à l'utilisateur.

-Comme il n'est pas possible d'ajouter une colonne au modèle utilisateur par défaut créé par `` devise '', exécutez la commande d'ajout de colonne pour créer des données liées à l'utilisateur telles que le nom.


8. Association de modèles

8-1. Modèle préféré

app/models/favorite.rb


class Favorite < ApplicationRecord
  belongs_to :user
  belongs_to :post
end

8-2. Modèle de poteau

app/models/post.rb


class Post < ApplicationRecord
  belongs_to :user
  has_many :favorites
end

・ Il est possible d'appeler post.favorites lors de l'attachement de likes aux posts. Vous pouvez obtenir le nombre de likes en utilisant post.favorites.count.

8-3. Modèle utilisateur

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

-Il est possible d'appeler user.favorites lorsque `` obtenir les likes de l'utilisateur ''.

-``` Si vous souhaitez afficher les publications que les utilisateurs aiment sur votre écran de profil, il y a ''. À ce moment-là, vous pourrez appeler user.favorite_posts. Il utilise l'option through option '' et l'associe au modèle Post via une table intermédiaire.

-Le modèle utilisé dans through est `` '' qui doit être associé en premier. Dans ce cas, les favoris doivent d'abord être associés.

-Dans la source, décrivez le nom du modèle qui est la source de référence du nom du modèle nommé.

has_many :Nom du modèle préféré, through: :Table intermédiaire, source: :Le nom du modèle qui est la source de référence du modèle nommé



---

### 9. Créer un contrôleur

$ rails g controller posts new index show #Omis si créé lors de la configuration du périphérique $ rails g controller users index show $ rails g controller favorites create destroy


 · (Messages,) utilisateurs, contrôleur de favoris

---
### 10. Mise en œuvre des fonctions utilisateur

#### 10-1. Modification du routage


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


Rails.application.routes.draw do

  resources :users, only: [:index, :show]  #Pour la liste des utilisateurs et l'écran de profil
  devise_for :users  #Pour le mécanisme de connexion

end

10-2. Modification du contrôleur des utilisateurs

app/controllers/users_controller.rb



class UsersController < ApplicationController

  before_action :authenticate_user!  #Authentification de l'utilisateur fournie par devise

  def index
    @users = User.all
  end

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

10-3. Modifier la vue de l'utilisateur

● vue d'index

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


liste des utilisateurs h1

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

● show

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


Page de profil utilisateur h1

p
  = @user.username
  = @user.email

10-4. Mettre un lien vers la page utilisateur dans la vue de l'application

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


  body
    - if user_signed_in?
      .
      .
      .
   +  = link_to 'Ma page', user_path(current_user)
   +  = link_to 'Liste d'utilisateur', users_path
    - else
      .
      .

11. Mise en œuvre des fonctions de détachement

11-1. Modification du routage

config/routes.rb


Rails.application.routes.draw do

  resources :users
  devise_for :users

  root to: 'posts#index'  #Spécifiez la liste de messages comme racine
  resources :posts

end

11-2. Modification du contrôleur de messages

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_l'utilisateur représente l'utilisateur connecté fourni par devise
    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

・ Lorsqu'un nouveau message est publié, le propriétaire du message créé est l'utilisateur qui l'a publié, utilisez donc current_user.posts''. Le user_id dans la table posts contient maintenant l'id de current_user. (Notez que cette méthode ne peut être utilisée que si le modèle ```User model et Post model sont associés ``)

11-3. Modification de la vue du message

● index

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


Liste des messages h1

- @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 nouveau poste

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

● show

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


page de détails de l'article h1

p= @post.content

11-4. Mettre un lien vers la page de publication dans la vue de l'application

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


  body
    - if user_signed_in?
      .
      .
      .
      = link_to 'Liste des messages', posts_path
    - else
      .
      .

12. Mise en œuvre d'une fonction similaire

12-1. Créer un bouton J'aime pour publier

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


Liste des messages h1

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

  - if user_signed_in?  #Une méthode fournie par l'appareil pour vérifier si l'utilisateur est connecté
    - 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

-``` Utilisez user_signed_in? '' Pour le rendre visible uniquement par l'utilisateur connecté.

-Comme c'est un mécanisme '' que le semblable est ajouté par l'action create et que le semblable disparaît par l'action de destruction, il est explicitement spécifié dans la méthode de l'assistant link_to.

Si vous l'aimez, vous voulez afficher le lien de suppression du like ``, et si vous ne l'avez pas encore aimé, vous voulez afficher le lien de création du like , alors Vérifiez-le avec la méthode `favorited_by (current_user )``.

-La méthode favored_by (current_user) sera créée après cela.

-``` Post.favorites.count affiche le nombre de likes de la publication` ``.

12-2. Définir une méthode pour vérifier les mentions J'aime

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

-Parce que c'est une méthode qui n'est appelée que pour le modèle Post, elle est définie comme une méthode d'instance Post.

-Vérifier si l'id de l'utilisateur connecté existe dans user_id de la `` table des favoris ''.

-Il sera utilisé comme post.favorited_by (current_user). Faisons un peu plus facile

ruby:posts/index.html.slim


Liste des messages h1

- @posts.each do |post|
  .
  .
  .
  - if post.favorited_by?(current_user) 
      #Afficher le lien de suppression des likes
  - else
      #Afficher créer comme lien

-Cela montre le code suivant.

- if post.favorites.where(user_id: current_user.id).exists?
    #Supprimer l'affichage du lien
- else
    #Afficher créer comme lien

-``` Récupère l'identifiant de l'utilisateur connecté `,` ʻuser_id est l'identifiant de l'utilisateur connecté à partir de la table des favoris de la publication acquise, et `vérifie s'il existe «Je vous laisse.

-Retourne vrai s'il existe. «« Cela signifie que vous l'aimez », affichez donc le lien de suppression similaire.

-Retourne false s'il n'existe pas. Je n'aime pas ça '', alors affichez le lien de création similaire.

12-3. Modification du routage

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

-Les favoris sont imbriqués dans les messages. Cela facilite la spécification d'un chemin pour aimer un article, tel que post_favorites_path```.

12-4. Modification du contrôleur des favoris

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

-``` Stocke l'identifiant du message que vous aimez, `` , `dans le tableau des favoris de l'utilisateur connecté. Et en le sauvegardant, il est considéré comme une subvention de likes.

-Obtenir et supprimer les données dans la table des favoris où l'id du message pour lequel vous avez appuyé sur ```Unlike "correspond à l'id de l'utilisateur qui est` ` Ce faisant, il est considéré comme une aversion.

12-5 Sur la page de l'utilisateur, affichez les messages que l'utilisateur a aimés. À propos, les messages publiés par l'utilisateur sont également affichés.

● Modifier l'action show du contrôleur des utilisateurs

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

・ Dans @ posts, je reçois des messages normaux pour afficher les messages normaux.

・ Dans @ favorite_posts, les messages que l'utilisateur aime sont acquis. C'est pourquoi dans app / models / user.rb, nous avons fait une association avec le modèle Post sous le nom favorite_posts via le tableau des favoris.

● Modifier show.html.slim

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


Page de profil utilisateur h1

p
  = @user.username

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

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

・ Ce qui précède montre les messages que les utilisateurs aiment.

・ Ci-dessous montre les messages publiés par les utilisateurs.

-Vous pouvez le faire ressembler à Twitter en basculant par événement de clic, mais je ne le ferai pas ici.

Ceci termine la mise en œuvre de la fonction similaire.

Des articles très utiles

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

Recommended Posts

[Rails] Implémentation d'une fonction similaire
[Rails] Implémentation asynchrone de la fonction similaire
[Rails] À propos de la mise en œuvre de la fonction similaire
[Ruby on rails] Implémentation d'une fonction similaire
Implémentation d'une fonction similaire (Ajax)
[Rails] Implémentation de la fonction de catégorie
[Rails] Implémentation de la fonction tutoriel
[Rails] Implémentation de la fonction de prévisualisation d'image
Implémentation d'une fonction similaire en Java
Implémentation de la fonction de recherche
Mise en place de la fonction de tri des rails (affichés par ordre de nombre de like)
Rails [Pour les débutants] Implémentation de la fonction de commentaire
Mise en œuvre de la fonction de pagénation
[Rails] Implémentation de la fonction de recherche en utilisant le ransack de gem
Implémentation de la fonction de connexion Ruby on Rails (Session)
[Rails] Implémentation de la fonction d'agrandissement d'image à l'aide de lightbox2
Implémentation de la suppression d'ajax dans Rails
Implémentation de la fonction de recherche floue Rails
Implémentation de la fonction de recherche séquentielle
Implémentation de la fonction de prévisualisation d'image
Mise en œuvre de la fonction déroulante de catégorie
[Rails] Implémentation de la fonction glisser-déposer (avec effet)
Implémentation de la fonction de connexion Ruby on Rails (édition de devise)
[Rails] Implémentation de la fonction de catégorie multicouche en utilisant l'ascendance "Préparation"
[Rails] Implémentation de la fonction de catégorie multicouche à l'aide de l'ascendance "seed edition"
[Rails] Implémentation de la suppression logique utilisateur
[Rails] Implémentation de fonctions de catégorie plusieurs à plusieurs
[Rails] Implémentation de la fonction de catégorie d'ascendance gemme
[Ruby on Rails] Implémentation de la fonction de commentaire
[Rails] Commentaire mémo de procédure d'implémentation
[Rails] Implémentation de la fonction de catégorie multicouche à l'aide de l'ascendance "Formulaire de création"
[Rails] Ajout de la fonction de commentaire Ruby On Rails
J'ai essayé d'implémenter le traitement Ajax de la fonction similaire dans Rails
Implémentation de la fonction d'authentification des utilisateurs à l'aide de devise (2)
Implémentation de la fonction DM
Rails Ajout d'une fonction de connexion facile et facile
[Rails] [jQuery] Implémentation de fonction asynchrone avec remote: true et js.erb
[Ruby on Rails] Suivez l'implémentation de la fonction: bidirectionnelle
[Rails] Fonction de catégorie
Implémentation de la fonction d'authentification des utilisateurs à l'aide de devise (1)
[Rails] Implémentation de la fonction coupon (avec fonction de suppression automatique par traitement par lots)
Les rails suivent la fonction
Échafaudage de procédure d'implémentation de fonction CRUD de base
Implémentation de la fonction d'authentification des utilisateurs à l'aide de devise (3)