Je vais vous expliquer comment implémenter la fonction post application et annuler la fonction à l'aide de Rails.
En gros, nous allons l'implémenter selon la procédure suivante.
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
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é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
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
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