Falls Sie es vergessen, habe ich die Implementierung der ähnlichen Funktion zusammen mit dem Entwurf kurz zusammengefasst.
Umgebung Schienen 5.2 Serie Ruby 2.6-Serie
Bibliothek verwendet devise Slim
$ cd
$ rails new favorite_function
$ cd favorite_function
Gemfile
gem 'slim-rails' #Bietet schlanken Generator
gem 'html2slim' #Konvertiert Dateien im ERB-Format in ein schlankes Format
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' #Das root möchte ich in der App setzen_URL angeben
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
__ * Wenn Sie das Devise-Verzeichnis in Slim konvertieren, tritt in devise / shared / _error_messages.html.slim ein Fehler auf. Beheben Sie ihn. __ __
ruby:devise/shared/_error_messages.html.slim
- if resource.errors.any?
#error_explanation
h2
#In den folgenden 3 Zeilen tritt ein Fehler auf. Beheben Sie ihn daher wie folgt
= 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 'Ausloggen', destroy_user_session_path, method: :delete
- else
=link_to 'Anmelden', new_user_registration_path
=link_to 'Einloggen', new_user_session_path
.
.
.
・ Wenn Sie nicht wissen, welcher Pfad zu welcher Aktion führt, überprüfen Sie dies mit dem Befehl 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
Durch die Einstellung von `` `Modellname: Referenzen``` wird der Schlüssel für die Fremdsprache automatisch in der Migrationsdatei festgelegt, und die Zuordnung erfolgt auch in der Modelldatei.
Da Benutzer und Post eine Eins-zu-Viele-Beziehung haben, verweisen Sie auf Post, um anzuzeigen, dass es dem Benutzer gehört.
-``` Benutzer hat mehrere Likes für Post `,` `Post hat auch mehrere Likes von User
`` Many-to-many
, also mach es zu einem Favoriten Stellen Sie andererseits eine Referenz auf, die angibt, dass sie Eigentum von Post und Benutzer ist.
`devise
erstellten Standardbenutzermodell eine Spalte hinzuzufügen, führen Sie den Befehl zum Hinzufügen von Spalten aus und erstellen Sie benutzerbezogene Daten wie den Namen.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
・ Es ist möglich, post.favorites aufzurufen, wenn Likes an Posts angehängt werden. Sie können die Anzahl der Likes mithilfe von post.favorites.count ermitteln.
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
-Es ist möglich, user.favorites aufzurufen, wenn `` `Benutzer Likes``` erhalten.
-``` Wenn Sie Beiträge anzeigen möchten, die Benutzern auf Ihrem Profilbildschirm gefallen, gibt es `. Zu diesem Zeitpunkt können Sie user.favorite_posts aufrufen. Es verwendet die Option
through``
und ordnet sie über eine Zwischentabelle dem Post-Modell zu.
-Das in through verwendete Modell ist `` `, das zuerst zugeordnet werden muss. In diesem Fall müssen zuerst Favoriten zugeordnet werden.
has_many :Lieblingsmodellname, through: :Zwischentisch, source: :Der Modellname, der die Referenzquelle des benannten Modells ist
---
### 9. Controller erstellen
$ rails g controller posts new index show #Wird weggelassen, wenn er beim Einstellen des Geräts erstellt wurde $ rails g controller users index show $ rails g controller favorites create destroy
· (Beiträge,) Benutzer, Favoriten-Controller
---
### 10. Implementierung von Benutzerfunktionen
#### 10-1. Bearbeiten des Routings
#### **`config/routes.rb`**
```ruby
Rails.application.routes.draw do
resources :users, only: [:index, :show] #Für Benutzerliste und Profilbildschirm
devise_for :users #Für den Anmeldemechanismus
end
app/controllers/users_controller.rb
class UsersController < ApplicationController
before_action :authenticate_user! #Benutzerauthentifizierung von devise
def index
@users = User.all
end
def show
@user = User.find(params[:id])
end
end
ruby:app/views/users/index.html.slim
h1 Benutzerliste
- @users.each do |user|
p
= link_to user.email, user
● show
ruby:app/views/users/show.html.slim
h1 Benutzerprofilseite
p
= @user.username
= @user.email
ruby:app/views/layouts/application.html.slim
body
- if user_signed_in?
.
.
.
+ = link_to 'Meine Seite', user_path(current_user)
+ = link_to 'Benutzerliste', users_path
- else
.
.
config/routes.rb
Rails.application.routes.draw do
resources :users
devise_for :users
root to: 'posts#index' #Geben Sie die Beitragsliste als Stamm an
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_Benutzer repräsentiert den von devise bereitgestellten angemeldeten Benutzer
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
・ Wenn ein neuer Beitrag veröffentlicht wird, ist der Eigentümer des erstellten Beitrags der Benutzer, der ihn veröffentlicht hat. Verwenden Sie daher `current_user.posts
`. Die user_id in der posts-Tabelle enthält jetzt die ID von current_user. (Beachten Sie, dass diese Methode nur verwendet werden kann, wenn das Benutzermodell und das Post-Modell zugeordnet sind.)
● index
ruby:app/views/posts/index.html.slim
h1 Beitragsliste
- @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 neuer Beitrag
= form_with model: @post do |f|
p
= f.label :content
= f.text_area :content
= f.submit 'Post'
● show
ruby:app/views/posts/show.html.slim
h1 Beitragsdetailseite
p= @post.content
ruby:app/views/layouts/application.html.slim
body
- if user_signed_in?
.
.
.
= link_to 'Beitragsliste', posts_path
- else
.
.
ruby:app/views/posts/index.html.slim
h1 Beitragsliste
- @posts.each do |post|
p= link_to post.user.email, user_path(post.user.id)
p= link_to post.content
- if user_signed_in? #Eine von devise bereitgestellte Methode, um zu überprüfen, ob der Benutzer angemeldet ist
- 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
-Verwenden Sie `user_signed_in?`
Um `` `nur für den angemeldeten Benutzer sichtbar zu machen.
`Mechanismus handelt, bei dem die Likes durch die Aktion '' create '' hinzugefügt werden und die Likes durch die Aktion`
destroy gelöscht werden, wird dies in der Methode des link_to-Hilfsprogramms explizit angegeben.・ `Wenn es Ihnen gefällt, möchten Sie den Löschlink des Like anzeigen`
, und wenn es Ihnen noch nicht gefallen hat, möchten Sie den Link zum Erstellen des Like`` anzeigen, also
` Überprüfen Sie dies mit der Methode "favorited_by (current_user)".
-Die favored_by (current_user) -Methode wird danach erstellt.
-``` Post.favorites.count zeigt die Anzahl der Likes des Beitrags an.
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
-Überprüfen Sie, ob die ID des angemeldeten Benutzers in user_id der `Favoriten-Tabelle
vorhanden ist.
-Es wird wie post.favorited_by (current_user) verwendet. Machen wir es uns etwas einfacher
ruby:posts/index.html.slim
h1 Beitragsliste
- @posts.each do |post|
.
.
.
- if post.favorited_by?(current_user)
#Löschlink von Likes anzeigen
- else
#Show wie Link erstellen
-Dies zeigt den folgenden Code.
- if post.favorites.where(user_id: current_user.id).exists?
#Linkanzeige löschen
- else
#Show wie Link erstellen
-``` Ruft die ID des angemeldeten Benutzers `ab,` `user_id ist die ID des angemeldeten Benutzers
aus der Favoritentabelle des erfassten Beitrags und `` prüft, ob es existiert
` »Ich lasse dich.
Gibt true zurück, wenn es vorhanden ist. `Es bedeutet, dass es Ihnen gefällt
, also zeigen Sie den Link zum Löschen an.
Gibt false zurück, wenn es nicht vorhanden ist.
Ich mag es nicht `` `, also zeige den Link zum Erstellen an.
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
-Favoriten sind in Posts verschachtelt. Dies macht es einfacher, einen Pfad anzugeben, der einem Beitrag gefällt, z. B. "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
-``` Speichert die ID des Beitrags, den Sie mögen, `` ,
`in der Favoriten-Tabelle des angemeldeten Benutzers. Und wenn man es speichert, wird es als Gewährung von Likes angesehen.
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
・ In @ posts
erhalte ich reguläre Posts, um reguläre Posts anzuzeigen.
・ In @ favourite_posts
werden die Beiträge erfasst, die dem Benutzer gefallen. Aus diesem Grund habe ich in app / models / user.rb über die Favoritentabelle eine Verknüpfung mit dem Post-Modell unter dem Namen Favorit_posts hergestellt.
ruby:app/views/users/show.html.slim
h1 Benutzerprofilseite
p
= @user.username
h3 wie
- @favorite_posts.each do |f_post|
p
= f_post.content
h3 post
- @posts.each do |post|
p
= post.content
・ Das Obige zeigt Beiträge, die Benutzern gefallen.
・ Unten sehen Sie die von Benutzern geposteten Beiträge.
-Sie können es wie Twitter aussehen lassen, indem Sie per Klick-Ereignis wechseln, aber ich werde es hier nicht tun.
Damit ist die Implementierung der Like-Funktion abgeschlossen.
https://qiita.com/kazukimatsumoto/items/14bdff681ec5ddac26d1
Recommended Posts