如何使用Phoenix Framework中单独模型的选项和值创建选择标记

时间:2016-04-18 15:22:38

标签: elixir phoenix-framework

我有一个带有select标签的相对简单的表单(下拉表单字段)。

select标记的选项/值是动态的,应在我的Categories模型更新时更新。

这就是我现在所拥有的:

表单通过web/templates/posts/new.html.eex模板呈现,如下所示:

<%= render "form.html", changeset: @changeset,
                        action: project_path(@conn, :create) %>

以下是web/templates/posts/form.html.eex

中的相关表单字段
  <div class="form-group">
    <%= select f, :category, MyApp.Category, class: "form-control" %>
    <%= error_tag f, :category %>
  </div>

但我收到以下错误:

protocol Enumerable not implemented for MyApp.Category

如何在表单中将我的Categories存储库用作选择标记选项?

编辑:我已按照Gazler(感谢Gaz)的建议,在PostController的新动作中获取了类别。

def new
  categories = Repo.all(MyApp.Category)
  changeset = 
  user
  |> build_assoc(:projects)
  |> Project.changeset()
  render(conn, "new.html", changeset: changeset)
end

并更新了我的模板:

  <div class="form-group">
    <%= select f, :category, @categories, class: "form-control" %>
    <%= error_tag f, :category %>
  </div>

现在我收到以下错误:

assign @categories not available in eex template.

编辑:看起来我应该使用multiple_select/4作为Aaron did here,因为我希望选项能够显示类别标题,并将值作为类别ID。

解答:

使用Gazler发布的链接(在我的post_controller的新动作中)使用此行结束:

categories = Repo.all(Qlc.Category) |> Enum.map(&{&1.title, &1.id})

1 个答案:

答案 0 :(得分:6)

你需要获取你的选项(在你的控制器中):

def new(conn, params) do
  query = from(c in Category, select: {c.id, c.name})
  categories = Repo.all(query)
  changeset = 
    user
    |> build_assoc(:projects)
    |> Project.changeset()
    render(conn, "new.html", changeset: changeset, categories: categories) 
end

然后你应该在选择中使用它。不是从:category更改为:category_id

<div class="form-group">
  <%= select f, :category_id, @categories, class: "form-control" %>
  <%= error_tag f, :category_id %>
</div>

您可能需要转换选项。有关如何执行此操作,请参阅How to show all records of a model in Phoenix select field