Ich habe mit Ruby on Rails eine einfache App erstellt, daher hatte ich es schwer Ich habe einen Artikel geschrieben, weil ich mir die Punkte notieren wollte, die ich mir in Zukunft als Memorandum ausgedacht habe.
· Mac ・ Git installiert ・ Ruby 2.6.5 ・ Schienen 6.0.3.4 ・ Visual Studio-Code
Es ist eine Anwendung, mit der Benutzer Kleidung teilen können. Wenn ich normalerweise Kleidung kaufe, beziehe ich mich oft auf die Kleidung, die von anderen getragen wird. Daher wäre es praktisch, eine App zu haben, mit der ich Fotos meiner Kleidung, Eindrücke vom Kommen und Preise teilen kann. Ich dachte, ich habe es geschaffen.
Die folgenden drei Tabellen werden dieses Mal verwendet. Ein Benutzer kann mehrere Kleidungsstücke (Fuku) posten. Darüber hinaus ermöglicht der Zwischentisch den Benutzern, die geposteten Kleidungsstücke zu mögen.
column | type |
---|---|
id | string |
name | string |
string | |
profile_image_id | string |
column | type |
---|---|
id | string |
title | string |
body | text |
user_id | integer |
image_id | string |
column | type |
---|---|
id | string |
user_id | integer |
fuku_id | integer |
Beim Erstellen der Anmeldungsauthentifizierungsfunktion dauert es einige Zeit, alles von Grund auf neu zu erstellen. Daher habe ich devise verwendet, das einfach zu implementieren ist.
$rails generate devise :install
Die für die Anmeldefunktion erforderliche Einstellungsmethode wird angezeigt. Fügen Sie daher den Code hinzu. Erstellen Sie außerdem ein Benutzermodell basierend auf dem Gerät.
$rails g devise User
Derzeit enthält das auf dem Gerät basierende Benutzermodell standardmäßig nur E-Mail- und Kennwortspalten. Fügen Sie daher der Migrationsdatei Name und Profilbild-ID hinzu.
$rails g migration add_name_to_users name:string profile_image_id:string
$rails db:migrate
Fügen Sie der neuen Registrierungsansicht auch die Felder profile_image und name hinzu.
ruby:new.html.erb
<div class="field">
<%= f.label :Profilbild%>
<%= f.attachment_field :profile_image %>
</div>
<div class="field">
<%= f.text_field :name, autofocus: true, placeholder:"Name", autocomplete: "name"%>
</div>
Ich dachte, dass die neue Registrierungsfunktion des Benutzers damit implementiert werden könnte, aber selbst wenn ich den Namen und das Profilbild auf dem neuen Registrierungsbildschirm einstelle Es wurde nicht in der Datenbank wiedergegeben. Bei der Untersuchung wurde festgestellt, dass devise nur E-Mail-Adressen und Passwörter akzeptiert, wenn standardmäßig neue registriert werden. Durch Beschreiben des starken Parameters in application.controller wie unten gezeigt, kann die hinzugefügte Spalte auch empfangen werden.
ruby:application.controller.rb
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :profile_image])
end
Ich möchte die Funktion zum Posten von Bildern in jedem Benutzermodell und Fuku-Modell implementieren, daher habe ich mich für die Verwendung von refile entschieden. Es gibt eine Carrierwave in einem anderen ähnlichen Juwel, aber Refile ist eine relativ neue, die vom Schöpfer von Carrierwave als Nachfolger erstellt wurde. Deshalb habe ich diesmal Refile verwendet. Ich habe auf diesen Artikel von Qiita verwiesen. https://qiita.com/salvage0707/items/2614c97a1f256027ef71
Wir werden eine Funktion implementieren, mit der Sie die geposteten Kleidungsstücke mögen können.
① "Gefällt mir Benutzer-ID: Benutzer-ID" und "Gefällt mir Kleider-ID: fuku_id" werden in "Zwischentabelle: Likes-Tabelle" gespeichert. ② Die Schaltfläche "Gefällt mir" wechselt je nach "Gefällt mir" und "Gefällt mir".
Erstellen Sie zunächst eine Tabelle (Likes-Tabelle), in der "beliebte Benutzer" und "beliebte Kleidung" gespeichert sind.
$rails g model like user_id:integer fuku_id:integer
$rails db:migrate
Wir werden die Assoziation für das Modell beschreiben. Benutzer und Fuku sind eins zu viele, User und Like sind eins zu viele, Fuku und Like sind auch eins zu viele
user.rb
has_many :fukus
has_many :likes
fuku.rb
belongs_to :user
has_many :fukus
like.rb
belongs_to :user
belongs_to :fuku
Es wird sein.
Likes sind in Fukus verschachtelt, um die geposteten Klamotten zu mögen. Ich fand, dass die Ressource sehr praktisch ist, da das Routing automatisch nur durch Schreiben einer Zeile trainiert wird.
resources :fukus do
resources :likes, only:[:create, :destroy]
end
Machen Sie einen Likes-Controller.
$rails g controller likes
Bearbeiten Sie dann auf der Seite mit den Kleidungsdetails die Ansicht, damit der angemeldete Benutzer sie mögen kann. Stellen Sie sicher, dass sich der angemeldete Benutzer anders verhält, wenn er es bereits mag und wenn er es nicht tut.
ruby:app/views/fukus/show.html.erb
<% if Like.find_by(user_id:current_user.id, fuku_id:@fuku.id) %>
<p><%= link_to 'Gefallen', fuku_likes_path(@fuku), method: :delete %></p>
<%else%>
<p><%= link_to 'Wie schön', fuku_likes_path(@fuku), method: :post %></p>
<%end%>
Beschreiben Sie den Likes-Controller wie folgt und speichern Sie die ID des Benutzers, der Ihnen gefallen hat, und den Beitrag in der Likes-Tabelle des Benutzers, der durch die Aktion "Erstellen" angemeldet ist. Ich storniere ein Like mit der Zerstörungsaktion.
likes_controller.rb
def create
@like=Like.new(user_id:current_user.id, fuku_id:params[:fuku_id])
@lika
redirect_back(fallback_location: root_path)
end
def destroy
@like =Like.find_by(user_id:current_user.id, fuku_id:params[:fuku_id])
@like.destroy
redirect_back(fallback_location: root_path)
end
Bearbeiten Sie dann den Controller und zeigen Sie ihn an, damit Sie die gewünschten Beiträge auf der Benutzerdetailseite sehen können.
@ fukus
→ Benutzer-ID der von jedem Benutzer geposteten Kleidung abrufen
@ liks
→ Ermittelt die Benutzer-ID der von jedem Benutzer gepressten Likes
users_controller.rb
def show
@user=User.find_by(id:params[:id])
@fukus=Fuku.where(user_id:@user.id)
@likes=Like.where(user_id:@user.id)
end
ruby:app/users/show.html.erb
<% @likes.each do |like| %>
<% fuku=Fuku.find_by(id:like.fuku_id)%>
<%= link_to(fuku_path(fuku)) do %>
<%=attachment_image_tag fuku,:image,class:"thumbnail150" %>
<%end%>
<%end%>
Damit ist die Implementierung der Like-Funktion abgeschlossen.
before_action :authenticate_user! Durch Schreiben am Anfang der Steuerung kann die dort durchgeführte Verarbeitung nur vom angemeldeten Benutzer ausgeführt werden. Wenn Sie beispielsweise zulassen möchten, dass nicht angemeldete Benutzer nur die Indexaktion ausführen, beschreiben Sie Folgendes.
class FukusController < ApplicationController
before_action :authenticate_user!, except: [:index]
def index
@fukus=Fuku.all
end
def show
@fuku=Fuku.find_by(id:params[:id])
end
end
Durch das Erstellen einer App von Grund auf habe ich die Mindestkenntnisse in der CRUD-Verarbeitung erworben. Ich bekomme immer noch häufig Fehler, aber ich denke, dass ich durch die Bezugnahme auf ähnliche Artikel die Fähigkeit erlangt habe, sie selbst zu untersuchen und zu lösen. Ich möchte weiter lernen und beispielsweise eine Funktion hinzufügen, mit der Benutzer Nachrichten aneinander senden können, und eine Funktion, mit der Benutzer nach Bekleidungsmarke, Typ und Preisspanne suchen können. Außerdem bin ich nicht gut darin, das Frontend zu implementieren, daher möchte ich auch diesen Bereich untersuchen.
Recommended Posts