--Verwenden Sie Rubin auf Schienen 6.0.0.
Ich mache eine Kopierseite einer bestimmten Frima-Seite, um das Programmieren zu lernen. Ich habe eine Funktion zum Bearbeiten von Produktinformationen implementiert, aber es fiel mir schwer, mehrere Bilder zu veröffentlichen. Deshalb habe ich beschlossen, sie als Referenz zu schreiben. Obwohl es sich nicht um eine große Menge handelt, ist sie in Teile unterteilt, damit Sie ein Gefühl der Leistung bekommen, wenn Sie sie später sehen. bitte verzeih mir. (Ich habe viel geschrieben! Ich möchte sein) Ich glaube nicht, dass irgendetwas in Teil 1 stecken bleibt, aber da es die Grundlage für Teil 2 und später sein wird, werde ich über das Aufwärmen schreiben.
1, Erstellen eines Basiscontrollers und eines Modells. 2, Implementierte Bildposting durch Zuordnen der Bildtabelle. 3, Einführung von jQuery zur Implementierung der Veröffentlichung mehrerer Bilder. 4, Anpassung auf dem Bearbeitungsbildschirm. 5, Vorschau des Bildes.
Wir werden jedes dieser fünf Verfahren separat implementieren.
Na dann
Erstarren Sie zunächst den Grundteil. Zuerst vom Terminal.
$ rails g contoroller products $ rails g model product $ rails db:migrate
Es ist der übliche Fluss. Details wie das Erstellen einer Datenbank und das Beschreiben einer Migrationsdatei werden weggelassen.
Beginnen wir mit der Stammdatei.
app/config/routes.rb
Rails.application.routes.draw do
root "products#index"
resources :products
devise_for :users, controllers: {
registrations: 'users/registrations'
}
end
Der Entwicklungsteil bezieht sich auf die bereits implementierten Benutzerfunktionen, sodass Sie sich darüber keine Gedanken machen müssen. Auch hier ist keine ausführliche Erklärung erforderlich. Ich habe eine grundlegende Aktion mit Ressourcen ausgeführt und eine Indexaktion im Stammpfad angegeben. (Dieses Mal werden "Zerstören" und "Zeigen" nicht verwendet, sodass Sie sie ausschließen können.)
Als nächstes folgt die Beschreibung der Steuerung.
app/controllers/products_controller.rb
class ProductsController < ApplicationController
before_action :ensure_current_user, only[:edit, :update]
before_action :set_product, only[:new, :create, :edit, :update]
def index
@products = Product.all
end
def new
@prodcut = Product.new
end
def create
@product = Product.new(product_params)
if @product.save
redirect_to products_path
else
render :new
end
end
def edit
end
def update
if @product.update(product_params)
redirect_to products_path
else
render :edit
end
end
private
def product_params
params.require(:product).permit(:name).merge(user_id: current_user.id)
end
def ensure_current_user
product = Product.find(params[:id])
if product.user_id != current_user.id
redirect_to action: :index
end
end
def set_product
@product = Product.find(params[:id])
end
end
Ist es vorerst so ein Ort? Ich werde Schritt für Schritt erklären.
Zunächst zu den grundlegenden Aktionen.
@products = Product.all
Es gibt kein Problem mit dem Index, alle in der Produkttabelle registrierten Datensätze werden abgerufen.
@prodcut = Product.new
Produkte werden neu registriert und erstellt. Erstellen Sie ein neues Objekt in model .new und weisen Sie ihm die Formularwerte zu.
def product_params params.require(:product).permit(:name).merge(user_id: current_user.id) end
Die auf diese Weise gesendeten Daten werden von der product_params-Methode empfangen. Es ist ein starker Parameter, den jeder liebt. Die Spalte ist nur ein Name, da sie nur die Mindestfunktionalität implementiert.
if @product.save redirect_to products_path else render :new end
Die folgende if-Anweisung wird als Fehlerbehandlung bezeichnet. Wenn der Prozess erfolgreich ist, wird der Index angezeigt, und wenn der Prozess fehlschlägt, wird erneut new angezeigt. Das Konzept enthält einige komplizierte Teile, aber ich denke, Sie sind bereits mit den Funktionen vertraut.
@product = Product.find(params[:id])
Als nächstes folgen die Bearbeitungs- und Aktualisierungsaktionen, aber was wir tun, ist das gleiche wie zuvor. Der Unterschied zu create besteht darin, dass Sie kein neues Objekt erstellen müssen, da die Daten bereits vorhanden sind, und das mit der Suchmethode ausgewählte Produkt mitbringen.
def ensure_current_user product = Product.find(params[:id]) if product.user_id != current_user.id redirect_to action: :index end end
Schließlich die Methode verify_current_user. Es mag auf den ersten Blick schwierig erscheinen, aber der Prozess ist sehr einfach. Der Punkt ist, dass Sie die Benutzerinformationen des ausgewählten Produkts und die angemeldeten Benutzerinformationen nicht bearbeiten können, wenn sie unterschiedlich sind.
Nachdem die Beschreibung des Controllers abgeschlossen ist, ist es Zeit, die Ansichtsdatei zu schreiben.
haml:app/view/products/index.html.haml
- if user_signed_in?
- @products.each do |product|
- if product.user_id == current_user.id
= link_to edit_product_path(product.id) do
#{product.name}
= link_to("Auflistung", new_product_path)
%h2 eingeloggt
= link_to 'Ausloggen', destroy_user_session_path, method: :delete
- else
%h2 nicht eingeloggt
= link_to 'Anmelden', new_user_registration_path
= link_to 'Einloggen', new_user_session_path
Beginnen wir mit dem Index, aber nur die ersten sechs Zeilen sollten notiert werden. Ist der Benutzer angemeldet? Ist das Produkt vom Benutzer registriert? Unter zwei Bedingungen, z. B. Bearbeiten, werden neue Pfade angezeigt.
haml:app/views/products/_form.html.haml
= form_with model: @product, local: true do |f|
= f.text_field :name, placeholder: 'name'
= f.submit 'SEND'
Ich glaube auch hier gibt es nichts Besonderes zu erklären. Mit der Methode form_with senden Sie Daten an das Produktmodell. Jetzt müssen Sie dies nur noch als Teilvorlage in new.html.haml und edit.html.haml als Render anzeigen.
Zu diesem Zeitpunkt haben Sie die Möglichkeit implementiert, Produktdaten zu erstellen und zu bearbeiten. (Die Spalte ist nur der Name, aber ...)
In den Spezifikationen,
Dies bedeutet, dass wir diese drei löschen konnten. Im nächsten Teil können wir Bilder hinzufügen (Bildtabelle), also bleiben Sie bitte in Kontakt.
Ich möchte eine Funktion zum Bearbeiten von Produktinformationen implementieren ~ part2 ~