【问题标题】:DRYing the controller in Phoenix在 Phoenix 中干燥控制器
【发布时间】:2017-11-20 08:59:16
【问题描述】:

在我的控制器中,我有 current_company 和 `current_user.用户必须在每个请求中发送当前公司。

所以我想,用户需要在标题中发送它。

所以在一个请求中,我有令牌 (jwt) 和公司。现在在我的控制器中我有

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

我正在提取 current_user 然后在我的函数调用中:def show(conn, %{"id" => id}, current_user) do 我使用它,现在我必须使用 company = conn.assigns.current_company 以便在每个功能中获取当前公司。

一切正常,我想看看是否有像我为 current_user 所做的那样的 DRY 解决方案,所以我不需要在我的控制器上重复它。

谢谢

【问题讨论】:

  • 当您调用apply 时,只需将conn.assigns.current_company 添加到该列表中?
  • 你的意思是这样的:apply(__MODULE__, action_name(conn), [conn, conn.params, conn.assigns.current_user, conn.assigns.current_company]?
  • 是的。它不适合你吗?
  • 我收到function Web.AssetController.show/4 is undefined or private. Did you mean one of: 错误。这是节目:show(conn, %{"id" => id}, current_user)
  • 更新您正在调用的函数(在本例中为show,以及所有其他函数。)

标签: controller elixir phoenix-framework dry


【解决方案1】:

您可以将任意数量的术语添加到您作为最后一个参数传递给apply 的列表中。 apply 将使用与该列表中一样多的参数调用相关函数。所以,你可以这样做:

apply(__MODULE__, action_name(conn),
  [conn, conn.params, conn.assigns.current_user, conn.assigns.current_company])

然后将该模块中的所有操作函数更改为接受 4 个参数。第四个现在将是当前的公司价值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    相关资源
    最近更新 更多