[RUBY] Schienen lernen Tag 3 Teil 2

Ruby on Rails 5 Schnelllernhandbuch Kapitel 7

7-1 Fügen Sie vor der Registrierung oder Bearbeitung einen Bestätigungsbildschirm ein

Vor der Registrierung wird ein Bestätigungsbildschirm angezeigt. Nach der Bestätigung stellen Sie die zu registrierenden Daten ein. Schreiben Sie zunächst die Aktion (konform_neue Aktion), die den Bestätigungsbildschirm auf dem Controller anzeigt.

app/controller/tasks_controller.rb


 def confirm_new
   @task = current_user.tasks.new(task_params)
   render :new unless @task.valid? #Wenn in der Datenbank@Ausführen, wenn keine Aufgabe vorhanden ist

Dann füllen Sie das Routing aus

config/routes.rb


resources :tasks do
  post :confirm, action: :confirm_new, on: :new
end

post :confirm, action: :confirm_new, on: :new Dieser Teil hatte ursprünglich die folgende Form

config/routes.rb


resources :tasks do
  new do
   post :confirm, action: :confirm_new
  end
end

Wenn der neue Block nur ein Element enthält, wird es unter Verwendung des Namens on :: block danach weitergeleitet.

Erstellen Sie als Nächstes eine Bestätigungsbildschirmansicht

slim:app/views/tasks/confirm_new.html.slim


h1 Bestätigung neuer Inhalte

= form_with model: @task, local: true do |f|
  table.table.table-hover
    tbody
      tr
        th= Task.human_attribute_name(:name)
        td= @task.name
        =f.hidden_field :description
      tr
        th= Task.human_attribute_name(:description)
        td= simple_format(@task.description)
        =f.hidden_field :description
  =f.submit 'Rückkehr', name: 'back', class: 'btn btn-secondary mr-3'
  =f.submit 'Anmeldung', class: 'btn btn-primary'

7-1-3 Entspricht dem Übergang von der Schaltfläche "Zurück" in der Registrierungsaktion.

Auf dem Bestätigungsbildschirm oben befinden sich zwei Schaltflächen, eine Zurück-Schaltfläche und eine Registrierungstaste. Wenn die Zurück-Taste funktionieren soll, müssen Sie bestimmen, welche dieser beiden Tasten gedrückt wird. Daher wird dem Namensattribut der Schaltfläche "Zurück" "Zurück" hinzugefügt. Wenn beim Programmieren das Namensattribut zurück gedrückt wird, kehrt es zur ursprünglichen Operation zurück. Mit anderen Worten, das Ergebnis von params [: back] sollte erhalten werden. Sie können in die Aktion create die Aktion zum Zurückkehren zum Original schreiben, wenn params [: back] gedrückt wird.

app/controllers/tasks_controller.rb


def create
  @task = current_user.tasks.new(task_params)

  if params[:back].present? #present?Ist ein boolescher Wert, der wahr ist, wenn es einen Wert gibt
    render :new
    return
  end

Arten von Methoden für boolesche Werte

Methodenname Bedeutung der Methode
nil? True, wenn der Wert der Variablen null oder kein Wert ist
empty? Der Wert der Variablen ist""True wenn (für Zeichenfolgen) oder wenn der Wert leer ist. Null?Der Unterschied zu ist leer?Kann einen variablen Wert haben, aber dieser Wert zeigt leer an
blank? True, wenn es keinen Wert gibt
present? True, wenn es einen Wert gibt

7-2 Fügen Sie dem Listenbildschirm eine Suchfunktion hinzu

Wenn die Anzahl der Aufgaben in der Aufgabenliste zunimmt, wird es schwierig, sie einzeln zu finden. Zu solchen Zeiten wäre es bequem, eine Suchfunktion zu haben. Verwenden Sie einen Edelstein namens Ransack, um eine Suchfunktion hinzuzufügen

7-2-2 Suche nach Namen Fügen Sie Suchfunktionen mit Ransack hinzu

app/controllers/tasks_controller.rb


def index
  @q = current_user.task.ransack(params[:q])
  @task = @q.result(distinct: true).recent
end

@q = current_user.task.ransack(params[:q])

Suchen Sie bei der Durchsuchung nach Abfrageparametern (params [: q]). Durchsuchen Sie die Aufgabe des angemeldeten Benutzers mit Ransack und geben Sie sie als @q ein

@task = @q.result(distinct: true).recent

@Q, das bei der Suche herauskam Ausgenommen doppelte Suchergebnisse (Ergebnis (eindeutig: wahr)) Anzeige in der Reihenfolge von Registrierungsdatum und -zeit (aktuell)

Nachdem wir Ransack implementiert haben, suchen wir tatsächlich in der Ansicht. Verwenden Sie search_form_for, um Suchfunktionen hinzuzufügen

slim:app/views/tasks/index.html.slim


h1 Aufgabenliste

= search_form_for @q, class: 'mr-5' do |f|
  .form_group.row
    =f.label :name_cont, 'Name', class: 'col-sm-2 col-form-label'
    .col-sm-10
      =f.search_field :name_cont, class: 'form-control'
  .form-group.row
    =f.label :created_at_gteq, 'Eingetragenes Datum', class: 'col-sm-2 col-form-label'
    .col-sm-10
      = f.search_field :created_at_gteq, class: 'form-control'
  .form-group
    =f.submit class: 'btn btn-outline-primary'

= link_to 'Anmelden', new_task_path, class:  'btn btn-primary mb-3'

name_cont: Wählen Sie den Namen aus, der teilweise mit dem Namen übereinstimmt. .search_field: Wo ausfüllen created_at_gteq: Wählen Sie einen Beitrag aus, der größer ist als das von Ihnen eingegebene Datum und die Uhrzeit der Eingabe (Zukunft: gteq).

7-3 Fügen Sie dem Listenbildschirm eine Sortierfunktion hinzu

app/controllers/tasks_controller.rb


def index
  @q = current_user.task.ransack(params[:q])
  @task = @q.result(distinct: true).recent
end

Früher habe ich nach den letzten sortiert, aber als nächstes werde ich in beliebiger Reihenfolge sortieren Zuerst ärgern

app/controllers/tasks_controller.rb


def index
  @q = current_user.task.ransack(params[:q])
  @task = @q.result(distinct: true)
end

ruby:app/views/tasks/index.html.slim


table.table.table-hover
  thead.thead-default
    tr
      th= sort_link(@q, :name, default_order: :desc)
      th= Task.human_attribute_name(:created_at)
      th

Wenn Sie sort_link hinzufügen, können Sie Sortiervorgänge ausführen. Das erste Argument ist der Wert, der durch Durchsuchen erhalten wird (hier @q). Das zweite Argument ist die zu sortierende Spalte (Name in diesem Fall) default_order: :desc

7-4 Senden Sie eine E-Mail

Rails verwendet einen Mechanismus namens Mailer, um E-Mails zu senden. Verfassen und senden Sie E-Mails mit Mailer. Mailer beschreibt in Mailer-Datei

app/mailers/task_mailer.rd


class TaskMailer < ApplicationMailer
  def creation_email(task)
    @task = task
    mail(
      subject: 'E-Mail zum Abschluss der Aufgabenerstellung'
      to: 'user@example'
      from: 'taskleaf@example'
     )
  end
end

Legen Sie die Mail mit Informationen wie Betreff, von und als Methode "create_email" fest

7-4-3 E-Mail-Übertragungsprozess

Machen Sie es möglich, tatsächlich E-Mails zu senden

app/controllers/tasks_controller.rb


def create
  @task = current_user.tasks.new(task_params)

  if params[:back].present?
    render :new
    return
  end

  if @task.save
    TaskMailer.creation_email(@task).deliver_now
    redirect_to @task, notice: "Aufgabe"#{@task.name}Wurde registriert"
  else
    render :new
  end
end

Wenn Sie TaskMailer.creation_email (@task) .deliver_now wie oben hinzufügen, wird eine E-Mail über @task gesendet. Deliver_Now ist eine Methode zur sofortigen Übertragung. Es gibt auch eine Deliver_Later-Methode

7-5 Laden Sie die Datei hoch und hängen Sie sie an das Modell an

Ein Dateiverwaltungsjuwel namens Active Storage kommt heraus und verwendet sie zum Anhängen von Fotos und Bildern Um es tatsächlich anzuhängen, hängen Sie es mit der folgenden Methode an

app/models/task.rb


class Task < ApplicationRecord
  has_one_attached :image
....

end

Mit der Methode has_one_attached ist es möglich, ein Bild einer Aufgabe zuzuordnen.

ruby:app/views/tasks/_form.html.slim


...
...
...
.form-group
  =f.label :image
  =f.file_field :image, class: 'form-control'
...
end

Setze "image: image" auch in ja.yml Erlaube sowohl Erlaubnis als auch Image der task_params-Methode

Schreiben Sie den Code so, dass er auch auf dem Bestätigungsbildschirm angezeigt wird

ruby:app/views/tasks/show.html.slim


...
tr
  th= Task.human_attribute_name(:image)
  td= image_tag @task.image if @task.image.attached?
tr
...
...
...

if @ task.image.attached? Gibt an, ob das Bild angehängt ist. Wenn es ein tatsächliches Bild gibt, zeigen Sie es mit image_tag an

7-7 Page Nation

Je mehr Aufgaben es gibt, desto schwieriger ist es, alle bisher durchgeführten Informationen anzuzeigen. Wenn die Anzahl der Dateien eine bestimmte Anzahl überschreitet, wird die Paginierung an die nächste Seite übergeben und die Informationen werden entsprechend der Seite verteilt, um den Vorgang zu vereinfachen. Für diese Paginierung wird eine Edelsteindatei namens Kaminari verwendet.

Ursprüngliche Datei "asks_controller "

app/controllers/tasks_controller.rb


def index
  @q = current_user.task.ransack(params[:q])
  @task = @q.result(distinct: true)
end

Durch Hinzufügen von .page (params [: page]) am Ende können Sie die Anzahl der Elemente bestimmen, die pro Seite angezeigt werden sollen (standardmäßig 25 Elemente pro Seite).

app/controllers/tasks_controller.rb


def index
  @q = current_user.task.ransack(params[:q])
  @task = @q.result(distinct: true).page(params[:page])
end

Stellen Sie als Nächstes sicher, dass es tatsächlich in der Ansichtsdatei angezeigt wird

ruby:app/views/tasks/index.html.slim


.mb-3
  =paginate @tasks
  =page_entries_info @tasks
...
...
...

Es wird automatisch mithilfe der Hilfsmethode paginate und der Hilfsmethode page_entries_info erstellt.

7-8 Asynchrone Verarbeitung und regelmäßige Ausführung durchführen (Job Scheduling)

Rails bietet ein Framework namens Active Job, um verschiedene Prozesse asynchron im Hintergrund auszuführen. ActiveJob wird verwendet, wenn:

・ Die Verarbeitung ist schwer und lässt den Benutzer warten. ・ Ich möchte, dass Sie zum angegebenen Datum und zur angegebenen Uhrzeit Maßnahmen ergreifen

In einem solchen Fall wird der als Sidekiq bezeichnete Mechanismus verwendet.

① Synchronisieren Sie zuerst Rails und Sideskiq

config/environments/development.rb


config.active_job.queue_adapter = :sideskiq

② Erstellen Sie app / jobs / sample_job.rb und erstellen Sie eine Perform-Methode

app/jobs/sample_job.rb


class SampleJob < ApplicationJob
  queue_as :deault

  def perform(*args)
    Sidekiq::Logging.logger.info "Ich habe einen Beispieljob ausgeführt"
  end
end

Rufen Sie die zu verarbeitende Methode perform auf

app/controller/tasks_controller.rb


def create
  @task = current_user.tasks.new(task_params)
  ...
  if @task.save
    TaskMailer.created_email(@task).deliver_now
    SampleJob.perform_later
...
...
...

SampleJob.perform_later führt jetzt eine asynchrone Verarbeitung durch

7-8-3 Geben Sie das Ausführungsdatum und die Ausführungszeit an

Wenn Sie die set-Methode verwenden, können Sie Datum und Uhrzeit für die Ausführung des Prozesses angeben.

#Laufen Sie am nächsten Tag mittags
SampleJob.set(wait_until: Date.tomorrow.noon).perform_later

#Nach einer Woche laufen
SampleJob.set(wait: 1.week).perform_later

Recommended Posts

Schienen lernen Tag 3 Teil 2
Schienen lernen Tag 1 Teil 2
Rails Lerntag 4
Schienen lernen Tag 2
Schienen Lerntag 1
Programmiertag 3
Rails Docker-Teil 1-
Rails Docker ~ Teil 2 ~
Java-Lerntag 2
Java-Lerntag 1
Rails Tutorial Kapitel 3 Lernen
[Rails] Lernen mit Rails Tutorial
Rails Tutorial Kapitel 4 Lernen
Rails Tutorial Kapitel 1 Lernen
Rails Tutorial Kapitel 2 Lernen
Ruby on Rails Lernrekord -2020.10.04
Ruby on Rails Lernrekord -2020.10.05
Java-Lerntag 4
Ruby on Rails lernen Rekord-2020.10.07 ②
Ruby on Rails lernen Rekord-2020.10.07 ①
Ruby on Rails Lernrekord -2020.10.06
Rails 5 Code Reading Teil 2 ~ Aktionsansicht ~
Rails Tutorial 6. Ausgabe Lernzusammenfassung Kapitel 10
Rails Tutorial 6. Ausgabe Lernzusammenfassung Kapitel 7
Rails Tutorial 6. Ausgabe Lernzusammenfassung Kapitel 4
Rails Tutorial 6. Ausgabe Lernzusammenfassung Kapitel 9
Rails Tutorial 6. Ausgabe Lernzusammenfassung Kapitel 6
Rails Tutorial 6. Ausgabe Lernzusammenfassung Kapitel 5
Rails Tutorial 6. Ausgabe Lernzusammenfassung Kapitel 2
Rails Tutorial Kapitel 0: Vorbereitende Grundkenntnisse 5
Rails Tutorial 6. Ausgabe Lernzusammenfassung Kapitel 3
Muskel Rubin auf Schienen Tag 1 ~ Umweltbau ~
Rails Tutorial 6. Ausgabe Lernzusammenfassung Kapitel 8