使用Phoenix Framework在conn中获取conn?

时间:2017-04-19 04:16:12

标签: elixir phoenix-framework

我尝试使用连接中的当前用户分配创建多对多关系。问题是我无法访问模型中的conn。我尝试用变更集传递它,但这似乎不是正确的方法。

处理此问题的最佳方法是什么?我想我可以将conn导入模型中。我有什么理由不想这样做吗?

以下是我的变更集现在的样子

def changeset(model, user, params \\ :invalid) do
    model
    |> cast(params, @required_fields)
    |> put_assoc(:users, [user])
    |> validate_required([:name])
    |> unique_constraint(:name)
end

更新

结束史蒂夫的建议。为模式添加了用户标识的虚拟字段,并将此函数添加到变更集管道

  def changeset(model, params \\ :invalid) do
    model
    |> cast(params, @required_fields)
    |> associate_current_user(params)
    |> validate_required([:name])
    |> unique_constraint(:name)
  end

  def associate_current_user(model, params) do
    case params do
      %{"user_id" => id} ->
        user = Repo.get!(User, id)

        model
        |> put_assoc(:users, [user])
      _ ->
        model
    end
  end

2 个答案:

答案 0 :(得分:3)

我不会这样做。它起初可能很诱人,但是后来它会让你或其他人感到困惑,他们会维护这段代码。

模型是你的应用程序的独立层,因此在该区域中使用conn会将它与控制器非常接近地耦合。虽然,模型只是一个Elixir模块,所以在完美的世界中你可以使用它们而不需要Phoenix和请求/响应周期。

还要考虑对该功能进行单元测试 - 您是否可以确保conn始终看起来像您需要和需要的?

不要混淆顾虑。为了编排conn flow,你有控制器,从Phoenix 1.3来管理模式,你就有了有限的上下文。

答案 1 :(得分:1)

为什么不将当前的user_id添加到参数中并以这种方式处理。如果新/更新来自Web表单,则很容易在模板中获取current_user并添加隐藏的输入。