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

And*_*rie 3 elixir phoenix-framework

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

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

这就是我现在所拥有的:

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

<%= render "form.html", changeset: @changeset,
                        action: project_path(@conn, :create) %>
Run Code Online (Sandbox Code Playgroud)

这是相关的表格字段 web/templates/posts/form.html.eex

  <div class="form-group">
    <%= select f, :category, MyApp.Category, class: "form-control" %>
    <%= error_tag f, :category %>
  </div>
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

protocol Enumerable not implemented for MyApp.Category
Run Code Online (Sandbox Code Playgroud)

如何将我的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
Run Code Online (Sandbox Code Playgroud)

并更新了我的模板:

  <div class="form-group">
    <%= select f, :category, @categories, class: "form-control" %>
    <%= error_tag f, :category %>
  </div>
Run Code Online (Sandbox Code Playgroud)

现在我收到以下错误:

assign @categories not available in eex template.
Run Code Online (Sandbox Code Playgroud)

编辑:看起来我应该multiple_select/4Aaron一样在这里使用,因为我想要显示类别标题和值作为类别ID的选项.

回答:

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

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

Gaz*_*ler 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
Run Code Online (Sandbox Code Playgroud)

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

<div class="form-group">
  <%= select f, :category_id, @categories, class: "form-control" %>
  <%= error_tag f, :category_id %>
</div>
Run Code Online (Sandbox Code Playgroud)

您可能需要转换选项.有关如何执行此操作,请参阅如何在Phoenix选择字段中显示模型的所有记录.

  • 您需要将其传递给您的模板.`<%= render"form.html",变更集:@ changeset,categories:@ categories` ... (2认同)