我有一个带有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})
答案 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。