2017-10-19 5 views
1

Je voudrais tarir cette commande:before_action: équivalent d'installation à Phoenix

defmodule Xyz.ExampleController do 
    use Xyz, :controller 

    alias XyZ.Shops 

    def a(conn, %{"id" => id}) do 
    product = Shops.get_product!(id) 
    tax = product.price * 0.15 

    ... 

    render(conn, "a.html", foobar: foobar, product: product) 
    end 

    def b(conn, %{"id" => id}) do 
    product = Shops.get_product!(id) 
    tax = product.price * 0.15 

    ... 

    render(conn, "b.html", foobar: foobar, tax: tax) 
    end 

    def c(conn, %{"id" => id}) do 
    product = Shops.get_product!(id) 
    tax = product.price * 0.15 

    ... 

    render(conn, "c.html", foobar: foobar) 
    end 

end 

Chaque fonction commence par cette partie:

product = Shops.get_product!(id) 
    tax = product.price * 0.15 

Dans le monde Ruby on Rails I'D mettre une méthode à appeler avec before_action :setup pour sécher le contrôleur.

Quelle est la meilleure façon d'obtenir un séchage à Phoenix?

+3

Vous pouvez utiliser un plug -> https://hexdocs.pm/phoenix/plug.html, et je vous en prie, ne mettez pas de logique métier dans les modules de cadre. – JustMichael

+2

Cette logique ne doit pas être dans un contrôleur IMO. Si c'était moi, je définirais une fonction qui fonctionne comme ceci: '{product, tax} = Shops.get_product_and_tax! (Id)' et appelle ça à chaque action. – Dogbert

+0

Que je vais le faire. Je pensais que ce serait plus propre de l'avoir dans une prise. Mais je suis heureux de garder la ligne de code dans chaque action. – wintermeyer

Répondre

1

Vous pouvez essayer d'utiliser la méthode de contrôleur action/2. De l'controller docs:

Comme contrôleurs sont prises, ils mettent en oeuvre à la fois init/1 et l'appel/2, et il fournit également une fonction appelée action/2 qui est responsable de envoi de l'action appropriée après la pile du bouchon (et est également remplaçable).

Dans le livre Programming Phoenix Chris McCord utilise cette action pour mettre un paramètre commun à toutes les fonctions de contrôleur comme celui-ci:

def​ action(conn, _) ​do​ 
​ apply(__MODULE__, action_name(conn), [conn, conn.params, conn.assigns.current_user]) 
​end​ 

Ainsi, chaque action comme index/2 est maintenant index/3 et a l'utilisateur actuel en tant que troisième paramètre.

Peut-être que cela pourrait vous aider?

+1

Je ne pense pas que l'utilisation de cette approche soit meilleure qu'une prise, elle est moins flexible et ne donne aucun avantage par rapport à une prise dans cette situation. – JustMichael