[RUBY] Implémenter la fonction d'application dans Rails

Je vais vous expliquer comment implémenter la fonction post application et annuler la fonction à l'aide de Rails.

Flux de mise en œuvre

En gros, nous allons l'implémenter selon la procédure suivante.

  1. Créer un tableau intermédiaire entre les postes et les candidats
  2. Associer les modèles les uns aux autres
  3. Définir le routage
  4. Définissez la fonction d'application et annulez la fonction dans le contrôleur
  5. Créez une vue du bouton d'application

Créer une table intermédiaire entre les postes et les candidats

Les publications peuvent avoir plusieurs candidats et les utilisateurs peuvent s'abonner à plusieurs publications. En conséquence, les publications et les utilisateurs ont une relation plusieurs-à-plusieurs et nécessitent une table intermédiaire.

De plus, nous définirons ici le demandeur comme «preneur» afin de faire la distinction entre l'affiche et le demandeur, même au sein du même utilisateur. Si le nom du modèle de l'article est «Post», vous devez créer une table intermédiaire appelée post_takers.

Pour créer une table intermédiaire, tapez d'abord la commande suivante dans le terminal pour créer un modèle.

$ rails g model PostTaker

Ouvrez le fichier de migration terminé et écrivez comme suit.

2020XXXXXXXXXX_create_post_takers.rb


class CreatePostTakers < ActiveRecord::Migration[6.0]
  def change
    create_table :post_takers do |t|
      t.references :post, foreign_key: true
      t.references :taker, foreign_key: {to_table: :users} 
      t.timestamps
    end
  end
end

Le point ici est la partie t.references: taker, Foreign_key: {to_table :: users}. En écrivant ainsi, vous pouvez vous référer à la table des utilisateurs tout en définissant le nom du candidat `preneur 'comme clé externe de la table intermédiaire. Article de référence: https://qiita.com/publichtml/items/1fba15d8071fab66d043

Associer les modèles les uns aux autres

Ensuite, écrivez l'association dans le modèle.

user.rb


class User < ApplicationRecord
  has_many :post_takers, foreign_key: "taker_id", dependent: :destroy
end

post.rb


class Post < ApplicationRecord
  has_many :post_takers, dependent: :destroy
  has_many :takers, through: :post_takers, dependent: :destroy
end

post_taker.rb


class PostTaker < ApplicationRecord
  belongs_to :taker, class_name: 'User', foreign_key: 'taker_id'
  validates_uniqueness_of :post_id, scope: :taker_id
end

appartient_à: taker, nom_classe: 'Utilisateur', clé_tranger: 'taker_id' dans post_taker.rb est En écrivant de cette manière, vous pouvez vous associer au candidat associé au modèle Utilisateur. Article de référence: https://qiita.com/gyu_outputs/items/421cc1cd2eb5b39e20ad

De plus, validates_uniqueness_of: post_id, scope :: taker_id est Nous avons rédigé une telle validation pour éviter que plusieurs combinaisons de poste et de candidat ne soient enregistrées.

Définir le routage

Décrivez l'action de l'application comme «prendre» et l'action d'annulation comme «annuler» dans le routage comme suit.

routes.rb


Rails.application.routes.draw do
  resources :posts do
    member do
      get 'take'
      get 'cancel'
    end
  end
end

Dans ce qui précède, membre est utilisé pour inclure l'id du message dans le chemin. Article de référence: https://qiita.com/hirokihello/items/fa82863ab10a3052d2ff

Définir la fonction d'application et annuler la fonction dans le contrôleur

Ajoutez la description suivante au contrôleur.

posts_controller.rb


class PostsController < ApplicationController
  before_action :set_post

  def show
    @user = @post.user
  end

  def take
    #Créer un enregistrement dans la table intermédiaire entre la publication et l'utilisateur connecté
    PostTaker.create(post_id: @post.id, taker_id: current_user.id)
    #Afficher le message flash (si vous ne voulez pas afficher le message flash, vous n'avez pas à l'écrire)
    flash[:notice] = 'La demande est complète.'
    #Rediriger vers la page de détails de l'article
    redirect_to action: "show"
  end

  def cancel
    #Extraire les enregistrements par le poste correspondant et l'utilisateur connecté de la table intermédiaire
    post_taker = PostTaker.find_by(post_g_id: @post.id, taker_id: current_user.id)
    post_taker.destroy
    flash[:notice] = 'L'annulation est terminée.'
    redirect_to action: "show"
  end

  private

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

Créer une vue du bouton d'application

Enfin, créez une vue du bouton d'application et le tour est joué! Le code suivant est écrit en haml.

show.html.haml


-#Afficher le bouton uniquement si l'affiche et l'utilisateur connecté ne correspondent pas
- if @user.id != current_user.id
  -#Les dossiers sont classés selon que l'utilisateur connecté est inclus ou non parmi les candidats au poste concerné.
  - if @post.taker_ids.include?(current_user.id)
    = link_to "Annuler la candidature", cancel_posts_path(@post.id), data: { confirm: "Voulez-vous annuler la candidature pour ce poste?" }
  - else
    = link_to "Appliquer", take_posts_path(@post.id), data: { confirm: "Souhaitez-vous postuler pour ce poste?" }

Recommended Posts

Implémenter la fonction d'application dans Rails
Implémenter une fonction de connexion simple dans Rails
Implémenter la fonction de téléchargement CSV dans Rails
Implémenter la fonction de recherche de publication dans l'application Rails (méthode where)
Markdown implémenté dans Rails
Créer une fonction d'authentification dans l'application Rails à l'aide de devise
Mettre en œuvre la fonction de classement par étoiles en utilisant Raty dans Rails 6
[Rails] Implémenter la fonction de recherche d'utilisateurs
Implémenter l'authentification LTI dans Rails
[Rails] Implémenter la fonction de publication d'images
[Rails] Implémentez la fonction d'enregistrement / suppression de carte de crédit dans PAY.JP
Ajoutez une fonction de recherche dans Rails.
Implémenter la fonction PHP implode en Java
Implémenter un formulaire de contact dans Rails
Implémenter l'application Spring Boot dans Gradle
Implémentez la fonction de connexion dans Rails simplement avec le nom et le mot de passe (1)
Implémentez la fonction de connexion dans Rails simplement avec juste un nom et un mot de passe (2)
Implémentez la fonction de connexion simplement avec le nom et le mot de passe dans Rails (3)
Implémenter la fonction d'enregistrement des utilisateurs et la fonction d'enregistrement de l'entreprise séparément dans Rails concevoir
[Rails] Implémentation d'une fonction de demande / d'approbation d'adhésion à la communauté à l'aide d'associations plusieurs-à-plusieurs
[Rails] Un moyen simple d'implémenter une fonction d'auto-introduction dans votre profil
Comment implémenter la fonctionnalité de recherche dans Rails
[Rails] Restrictions de fonction dans l'appareil (connexion / déconnexion)
J'ai essayé d'implémenter le traitement Ajax de la fonction similaire dans Rails
Implémenter la pagination des rails
[Rails] Fonction de catégorie
Group_by dans Rails
Les rails suivent la fonction
Les rails 6 (avec Webpacker en standard) implémentent la fonction de classement par étoiles
Comment implémenter la fonctionnalité de classement dans Rails
Implémenter des transitions de boutons à l'aide de link_to dans Rails
[Rails] Fonction de notification
Nuxt.js × Créer une application en mode API Rails
Implémenter un bouton de partage dans Rails 6 sans utiliser Gem
Fonction de publication implémentée par communication asynchrone dans Rails
Comment implémenter une fonctionnalité similaire dans Rails
Implémenter des itérations dans View en rendant une collection [Rails]
Fonction de notification simple dans Rails (uniquement lorsqu'elle est suivie)
Association de modèles dans Rails
Ajout de colonnes dans les rails
Désactiver les turbolinks dans les rails
[rails] fonction de classement des balises
Mettre en œuvre le BAN du compte Rails
^, $ dans l'expression régulière Rails
Utiliser des images avec des rails