2016-03-17 3 views
0

Cela me embrouillant tellement, j'ai 2 modèles client has_many :invocies et invoice belongs_to client, j'ai mon root mis en place pour indexer tous invoices et invoices peut également être consulté par le clients show Voir . J'ai un bouton dans mon invoice show view qui établit un lien avec la client:id que le invoice appartient àRetour au chemin de la vue du spectacle basé sur render

Retour factures formulaire de lien/montrer

<%= link_to 'Back', client_path(@invoice.client), class: "btn btn-primary" %> 

Cela fonctionne bien, mais il est vraiment difficile à lancer invoice show du chemin racine puis cliquez sur back et être redirigé vers la vue client show. Existe-t-il un moyen de revenir au root_path ou d'afficher 2 boutons dans une instruction if et d'en afficher un en fonction de la façon dont un utilisateur a lancé le invoice show view en premier lieu? Complètement coincé.

Voici fichier mes itinéraires

resources :invoices, only: [:new, :create, :destroy, :index] 
resources :clients do 
    resources :invoices, shallow: true 
end 

root 'invoices#index' 

Répondre

2

Un backlink simple:

link_to 'Back', :back, class: "btn btn-primary" 

devrait faire dans ce cas. Il utilisera le HTTP_REFERER ou une fonction Javascript pour accéder à la page précédente. Voir le documentation pour plus d'informations.

Mise à jour:

Je vous besoin de quelques exceptions à la règle "simple lien vers", vous devez créer une solution personnalisée. Une telle solution pourrait être que vous utilisez link_to :back par défaut mais remplacez-le en acceptant un paramètre "back_path" personnalisé dans des cas spéciaux. Vous pouvez créer un assistant personnalisé pour le faire.

L'exemple suivant utilise par défaut la liaison arrière standard, mais permet à la page précédente de définir un paramètre back_path qui sera compris par l'assistant back_link.

# application_helper.rb 
def back_link(params, name: "Back", class: "btn btn-primary") 
    if params[:back_path].present? 
    link_to name, params[:back_path], class: class 
    else 
    link_to name, :back, class: class 
    ens 
end 

Maintenant, vous utilisez le lien normalement dans votre point de vue:

<%= back_link(params) %> 

Et quand vous voulez remplacer le comportement par défaut, il suffit de passer la back_path param. Vous passerez généralement ce paramètre à la page que vous souhaitez retourner. Ensuite, vous devrez passer ce paramètre sur toutes les autres pages et/ou rediriger.

Say, pour un exemple non trivial, que de la page client show vous pouvez cliquer sur un lien pour créer une nouvelle facture, puis être redirigé vers la facture show la page et à partir de là que vous souhaitez cliquer sur le lien en arrière et obtenir à la page client show à nouveau.

Alors, ajoutez un lien vers les clients montrer la page, avec le back_path param pointant vers cette page:

# views/clients/show.html.erb 
<%= link_to 'New invoice', new_invoice_path(@client, back_path: client_path(@client)) %> 

Dans le formulaire de la page new, vous devrez ajouter un hidden_tag de transmettre la back_path param:

# views/invoices/_form.html.erb 
<%= hidden_field_tag 'back_path', params[:back_path] %> 

Ensuite, dans l'action du contrôleur create, vous devrez également passer ce sur redirect param:

# controllers/invoices_controller.rb 
redirect_to invoice_url(@invoice, back_path: params[:back_path]) 

Et enfin, vous pouvez maintenant utiliser l'assistant back_link pour afficher le lien correct:

# views/invoices/show.html.erb 
<%= back_link(params) %> 

Je sais qu'il est laid, mais c'est comme ça ... De plus, il n'est pas une solution idéale que généralement vous voulez une hiérarchie des liens de retour lorsque vous parcourez les pages (et accédez à une page de différents chemins) et cette solution ne résout que le premier lien de retour. Mais je pense que c'est quelque chose à construire.

+0

Cela ne pose aucun problème, sauf lorsqu'une nouvelle facture est créée que je redirige vers 'show', ce qui fait que le retour à partir de là vous ramène à la' nouvelle formule de facture' – Aloalo