Ich habe mit Ruby On Rails ein Portfolio erstellt

■ Einführung

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.

■ Umweltbau

· Mac ・ Git installiert ・ Ruby 2.6.5 ・ Schienen 6.0.3.4 ・ Visual Studio-Code

■ Übersicht über die App

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.

■ Datenbankdesign

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.

Benutzertabelle

column type
id string
name string
email string
profile_image_id string

Fukus Tisch

column type
id string
title string
body text
user_id integer
image_id string

Likes-Tabelle (Zwischentabelle)

column type
id string
user_id integer
fuku_id integer

Implementierung entwickeln

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

Implementierung neu erstellen

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

Zwischentisch

Wir werden eine Funktion implementieren, mit der Sie die geposteten Kleidungsstücke mögen können.

Erforderliche Verarbeitung

① "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".

Wie Modell

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

Verband

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.

Routing

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

Regler

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.

Ergänzung

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

Was ich in Zukunft lernen möchte

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

Ich habe mit Ruby On Rails ein Portfolio erstellt
Ich habe mit Ruby einen riskanten Würfel gemacht
Ich möchte eine Browsing-Funktion mit Ruby on Rails hinzufügen
Veröffentlichen Sie die mit Ruby on Rails erstellte App
Ich habe einen LINE Bot mit Rails + Heroku gemacht
[Ruby] Ich habe einen Crawler mit Anemone und Nokogiri gemacht.
Ich habe mit Swing eine GUI erstellt
Ich habe versucht, das Ruby on Rails-Plugin mit vim-plug zu installieren
Ich habe eine Entwicklungsumgebung mit Rails6 + Docker + PostgreSQL + Materialise erstellt.
[Ruby on Rails] Fügen Sie eine Spalte mit externen Schlüsselbeschränkungen hinzu
[Ruby on Rails] Test mit RSpec anzeigen
[Ruby] Ich habe einen einfachen Ping-Client erstellt
Hinweise zur Verwendung von FCM mit Ruby on Rails
[Ruby on Rails] Controller-Test mit RSpec
Ich habe eine Janken App mit Kotlin gemacht
Ich habe eine Taschenrechner-App für Android erstellt
[Portfolio] Lesezeichen-Verwaltungs-App [Ruby on Rails]
[Ruby on Rails] Modelltest mit RSpec
Anfänger haben mit Ruby on Rails ein Portfolio erstellt
Ich habe eine Janken App mit Android gemacht
Schritte zum Erstellen einer Ruby on Rails-Entwicklungsumgebung mit Vagrant
Einführung in Rspec mit Ruby on Rails x Docker
04. Ich habe mit SpringBoot + Thymeleaf ein Frontend gemacht
[Ruby on Rails] Erstellen Sie mit Chartick ein kreisförmiges Diagramm der Summen nach Spalten
Ich habe mit Ruby einen Blackjack gemacht (ich habe versucht, Minitest zu verwenden)
Ich habe eine Ruby-Erweiterungsbibliothek in C erstellt
[Rails] Ich habe eine Entwurfsfunktion mit enum erstellt
Einführung in Rspec, ein Testframework für Ruby on Rails
[Ruby on Rails] Ein Memorandum mit Layoutvorlagen
Ruby on Rails Grundlagen
Integrieren Sie Docker in Ihr Ruby on Rails-Portfolio!
So erstellen Sie eine Ruby on Rails-Entwicklungsumgebung mit Docker (Rails 6.x)
(Ruby on Rails6) Erstellen von Daten in einer Tabelle
Ruby On Rails Association
Bestimmen Sie die aktuelle Seite mit Ruby on Rails
So erstellen Sie eine Ruby on Rails-Entwicklungsumgebung mit Docker (Rails 5.x)
[Ruby on Rails] Hochladen mehrerer Bilder mit Refile
Ich habe mit Vue.js eine Seite erstellt, die Informationen zur Zuckereinschränkung zusammenfasst
Ich verstehe Ruby on Rails-Parameter (mit Hanshin Tigers Poker-Faceman Atsushi Nomi)
Erstellen Sie eine Ruby on Rails-Entwicklungsumgebung in AWS Cloud9
Führen Sie Ruby on Rails RSpec-Tests mit GitHub-Aktionen aus
Ich habe mit WebAssembly einen Zeichnungschat "8bit Paint Chat" erstellt
[Anfänger] Ich bin auf ein Projekt mit Rails6 gestoßen
Ich habe eine Bibliothek zum Anzeigen von Tutorials auf Android erstellt.
Site Map im RSS / Atom-Format mit Ruby on Rails erstellt
Ruby on Rails Lernrekord -2020.10.03
Ich habe DI mit Ruby versucht
Ruby on Rails Lernrekord -2020.10.04
[Ruby on Rails] Debuck (bindend.pry)
Ruby on Rails Lernrekord -2020.10.05
Ruby on Rails Lernrekord -2020.10.09
Ich habe eine Chat-App erstellt.
Ruby on Rails lernen Rekord-2020.10.07 ②