[RUBY] [Rails] Erben Sie Parameter zwischen Controllern mit Sessions Helper

Einführung

Wechseln Sie beim Erstellen einer Frima-App an einer bestimmten Programmierschule von der Kaufbestätigungsseite zur Kreditkartenregistrierungsseite. Nach der Registrierung der Karte kann ich nicht mehr zur Kaufbestätigungsseite wechseln.

** Ursache: Der Parameter: item_id war 0, als der Controller von items_controller.rb in credit_cards_controller.rb geändert wurde. ** **.

Einzelheiten

  1. Nachdem Sie sich als Benutzer angemeldet haben, wechseln Sie per Routing zur obersten Seite (Artikel-Index).
  2. Übergang zur Detailseite (Artikel # anzeigen) der ausgestellten Produkte anderer Benutzer (Artikel # erstellen).
  3. Wechseln Sie über die Schaltfläche "Kaufen" auf der Detailseite (Artikel # anzeigen) zur Produktkaufseite (Artikel # Kauf).
  4. Um Kreditkarteninformationen zu registrieren / zu ändern, wechseln Sie von der Schaltfläche Registrieren / Ändern zu (credit_cards # index).
  5. Wenn sich nach dem Übergang nichts ändert, klicken Sie auf die Schaltfläche Zurück, um zur Produktkaufseite (Artikel #Kauf) zu gelangen.
  6. Wenn geändert / nicht registriert, wechseln Sie zur Kartenregistrierungsseite (credit_cards # new, create) und dann zu (credit_cards # show). Klicken Sie anschließend auf die Schaltfläche Kartenentscheidung / -rückgabe, um zur Produktkaufseite (Artikel #Kauf) zu gelangen.
  resources :items, only: [:index, :new, :create, :show, :edit, :destroy] do
    get '/purchase/:id', to: 'items#purchase', as: :purchase
  end
  resources :credit_cards, only: [:index, :new, :create, :show, :destroy]

スクリーンショット 2020-10-11 13.37.34.png

** 5. In 4-1, 4-2 ist ein Fehler aufgetreten, dass keine item_id vorhanden ist **

スクリーンショット 2020-10-11 13.58.34.png

Wenn ich es im Terminal überprüfe, verschwindet item_id, wenn es sich auf dem Controller befindet.

Processing by ItemsController#purchase as HTML
  Parameters: {"item_id"=>"2"}
  Item Load (0.3ms)  SELECT  `items`.* FROM `items` WHERE `items`.`id` = 2 LIMIT 1
Processing by CreditCardsController#show as HTML

Implementierungsdetails

Ich suchte nach einer Möglichkeit, item_id zu übernehmen ...

[Rails] Verwendung der Sitzung Ruby on Rails Tutorial-Sitzung

Diese Sitzung zu beurteilen scheint brauchbar zu sein. Fügen Sie zunächst include Session Helper zu application_controller.rb hinzu.

application_controller.rb


class ApplicationController < ActionController::Base
  include SessionsHelper #Links hinzugefügt
end

Erstellen Sie /sessions_helper.rb in / app / helpers und rufen Sie SessionsHelper mit dem folgenden Code auf

/app/helpers/sessions_helper.rb


module SessionsHelper
end

Referenzartikel Warum wird die "Nicht initialisierte Konstante ApplicationController :: SessionsHelper (NameError)" angezeigt?

Jetzt ist die Sitzung fertig

Speichern Sie zunächst item_id in der Sitzung.

app/controllers/items_controller.rb


def purchase
  @item = Item.find(params[:item_id]) #Artikel von params_ID extrahieren
  session[:item_id] = @item #Gegenstand herausgenommen_ID in Sitzung speichern
end

Nehmen Sie als Nächstes die Parameter heraus, die in der Sitzung mit dem Controller (credit_cards # index, credit_cards # show) des Registrierungsziels für credit_card gespeichert wurden. Als ich es mit binding.pry überprüft habe, war es ein Array, also habe ich es mit Werten herausgenommen.

app/controllers/credit_cards_controller.rb


#session[:item_id]Sie können die Sitzungsdaten früher mit abrufen.
def index
  @item_id = session[:item_id].values.first 
end

def show
  @item_id = session[:item_id].values.first
end

Extrahieren Sie die vom Controller erstellte Instanzvariable (@item_id) mit Ansicht

rb:app/views/credit_cards/index.html.haml


= link_to "Rückkehr", "/items/#{@item_id}/purchase", class:'return'

rb:app/views/credit_cards/show.html.haml


%button.enter__permit__box.btn(onclick="location.href='/items/#{@item_id}/purchase'")Verwenden Sie die Zahlungsmethode Ihrer Wahl
= link_to "Rückkehr", "/items/#{@item_id}/purchase", class:'return'

Jetzt können Sie item_id in items # purchase ⇄ credit_cards # show, index umtauschen. Löschen Sie die Sitzung, als Sie das Produkt zuletzt gekauft haben

app/controllers/items_controller.rb


def pay
  session[:item_id] = nil
end

Dieses Mal habe ich die Sitzung zum Austauschen von Parametern verwendet, aber es scheint, dass ich Parameter über die URL austauschen kann, sodass ich es beim nächsten Mal versuchen möchte.

Darüber hinaus bestehen bei der Verwendung der Sitzung einige Risiken. Lesen Sie daher bei der Verwendung den folgenden Link.

Artikel, die Sie gemeinsam lesen möchten (Hinweise zum Umgang mit Sitzungen)

Rails Security Guide

Recommended Posts

[Rails] Erben Sie Parameter zwischen Controllern mit Sessions Helper
[Ruby on Rails] Gemeinsame Verarbeitung zwischen Controllern (unter Verwendung von Konkaven)