before_action:凤凰城的等效设置

时间:2017-10-19 12:08:10

标签: elixir phoenix-framework

我想干掉这个控制器:

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

每个函数都从这一部分开始:

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

在Ruby on Rails世界中,我给它设置了一个方法,用before_action :setup调用来干掉控制器。

在凤凰城实现干涸的最佳途径是什么?

1 个答案:

答案 0 :(得分:1)

您可以尝试使用action/2控制器方法。来自controller docs

  

由于控制器是插件,它们实现init / 1和call / 2,以及   它还提供了一个名为action / 2的函数   在插件堆栈之后调度适当的操作(也是   可重写)。

在书中Programming Phoenix Chris McCord使用此操作为所有控制器函数添加一个公共参数,如下所示:

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

因此,index/2等所有操作现在都是index/3,并将当前用户作为第三个参数。

也许这可以帮到你?