[RUBY] [Rails] Hériter des paramètres entre contrôleurs à l'aide de Sessions Helper

introduction

Lors de la création d'une application frima dans une certaine école de programmation, passez de la page de confirmation d'achat à la page d'enregistrement de la carte de crédit. Après avoir enregistré la carte, je ne peux plus passer à la page de confirmation d'achat.

** Cause: Le paramètre: item_id était égal à 0 lorsque le contrôleur est passé de items_controller.rb à credit_cards_controller.rb. ** **

Détails

  1. Après vous être connecté en tant qu'utilisateur, passez à la première page (items # index) par routage.
  2. Transition vers la page de détail (articles # afficher) des produits exposés d'autres utilisateurs (articles # créer).
  3. Accédez à la page d'achat du produit (articles # achat) à partir du bouton d'achat sur la page de détails (articles # afficher).
  4. Pour enregistrer / modifier les informations de carte de crédit, passez à (credit_cards # index) à partir du bouton Enregistrer / modifier.
  5. S'il n'y a pas de changement après la transition, cliquez sur le bouton de retour pour passer à la page d'achat du produit (articles #purchase).
  6. Si elle est modifiée / non enregistrée, passez à la page d'enregistrement de la carte (credit_cards # new, create), puis passez à (credit_cards # show). Après cela, cliquez sur le bouton de décision / retour de la carte pour passer à la page d'achat du produit (articles #purchase).
  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. Une erreur s'est produite dans 4-1, 4-2 indiquant qu'il n'y a pas de item_id **

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

Lorsque je l'enregistre dans le terminal, item_id disparaît lorsqu'il chevauche le contrôleur.

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

Détails d'implémentation

Je cherchais un moyen de reprendre item_id ...

[Rails] Comment utiliser Session Tutoriel-Session Ruby on Rails

Juger cette session semble utilisable. Tout d'abord, ajoutez include Session Helper à application_controller.rb.

application_controller.rb


class ApplicationController < ActionController::Base
  include SessionsHelper #Ajout de la gauche
end

Créez /sessions_helper.rb dans / app / helpers et appelez SessionsHelper avec le code ci-dessous

/app/helpers/sessions_helper.rb


module SessionsHelper
end

Article de référence Pourquoi la "Constante non initialisée ApplicationController :: SessionsHelper (NameError)" s'affiche?

Maintenant la session est prête

Tout d'abord, enregistrez item_id dans la session.

app/controllers/items_controller.rb


def purchase
  @item = Item.find(params[:item_id]) #élément des paramètres_Extraire l'identifiant
  session[:item_id] = @item #Article retiré_Enregistrer l'identifiant dans la session
end

Ensuite, retirez les paramètres enregistrés en session avec le contrôleur (credit_cards # index, credit_cards # show) de la destination d'enregistrement de la carte de crédit. Quand je l'ai vérifié avec binding.pry, c'était un tableau, donc je l'ai retiré avec des valeurs.

app/controllers/credit_cards_controller.rb


#session[:item_id]Vous pouvez récupérer les données de session plus tôt avec.
def index
  @item_id = session[:item_id].values.first 
end

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

Extraire la variable d'instance (@item_id) créée par le contrôleur avec vue

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


= link_to "Revenir", "/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'")Utilisez le mode de paiement de votre choix
= link_to "Revenir", "/items/#{@item_id}/purchase", class:'return'

Vous pouvez désormais échanger item_id dans les items # purchase ⇄ credit_cards # show, index. Supprimer la session lors de votre dernier achat du produit

app/controllers/items_controller.rb


def pay
  session[:item_id] = nil
end

Cette fois, j'ai utilisé la session pour échanger des paramètres, mais il semble que je puisse échanger des paramètres en utilisant l'URL, alors j'aimerais l'essayer la prochaine fois.

De plus, lors de l'utilisation de session, certains risques sont impliqués, veuillez donc lire le lien ci-dessous lorsque vous l'utilisez.

Articles que vous souhaitez lire ensemble (Notes sur la gestion des sessions)

Guide de sécurité des rails

Recommended Posts

[Rails] Hériter des paramètres entre contrôleurs à l'aide de Sessions Helper
[Ruby on Rails] Traitement commun entre les contrôleurs (à l'aide de concerts)