Au cas où vous l'oublieriez, j'ai brièvement résumé la mise en œuvre de la fonction similaire avec la conception.
environnement Série Rails 5.2 Série Ruby 2.6
Bibliothèque utilisée devise Slim
$ cd
$ rails new favorite_function
$ cd favorite_function
Gemfile
gem 'slim-rails' #Fournit un générateur Slim
gem 'html2slim' #Convertit les fichiers au format ERB au format Slim
gem 'devise'
$ bundle
$ 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
===============================================================================
config/environments/development.rb
Rails.application.configure do
.
.
.
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
.
.
.
end
$ 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
ruby:app/views/layouts/application.html.erb
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
$ 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
$ 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
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.
$ 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.
app/models/favorite.rb
class Favorite < ApplicationRecord
belongs_to :user
belongs_to :post
end
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.
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
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
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
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
.
.
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
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 ``)
● 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
ruby:app/views/layouts/application.html.slim
body
- if user_signed_in?
.
.
.
= link_to 'Liste des messages', posts_path
- else
.
.
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` ``.
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.
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```.
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.
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.
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.
https://qiita.com/kazukimatsumoto/items/14bdff681ec5ddac26d1
Recommended Posts