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