【发布时间】:2021-03-11 03:06:53
【问题描述】:
我正在尝试填充一个字段 :params(来自模型/架构),它是一个地图。我有一个工作的 form_for,我想通过复选框填充这个 :params 映射,以便在提交表单时控制器会收到类似%{... params => %{"param1" => "true", "param2" => "false"}} ...
我查看了 inputs_for,但这似乎并不能满足我的需求,因为它依赖于嵌套模式和模型,这意味着我需要为每组新参数创建一个新模式(我需要如果参数更改,则不需要更改源代码的通用内容)。
<%= form_for @changeset, audit_audit_path(@conn, :new_tool_request, @audit.id),
fn f -> %>
<%= render LayoutView, "changeset_error.html", conn: @conn, changeset: @changeset, f: f %>
<div class="form-group"><label>Tool</label>
<%= select f, :toolname, tools %>
</div>
<div class="form-group"><label>Parameter 1</label>
<%= checkbox f, :param1 %>
</div>
<div class="form-group"><label>Parameter 2</label>
<%= checkbox f, :param2 %>
</div>
<div class="form-group"><label>Date of Execution</label>
<%= datetime_select f, :date %>
</div>
<div class="form-group">
<%= hidden_input f, :audit_id, value: @audit.id %>
</div>
<%= submit "Request", class: "btn btn-primary" %>
<% end %>
因此,我需要将所有这些参数放入映射中,而不是为param1 和param2 设置这些复选框。如果另一个表单使用不同的参数复选框呈现,则它必须在与架构没有任何关系的情况下填充。
谢谢!
【问题讨论】:
-
如果我的问题是正确的,我想你只需要为它们生成一个名称空间“params”的名称属性,比如
<%= checkbox f, :param1, name: "params[param1]" %>和<%= checkbox f, :param2, name: "params[param2]" %>,但我相信它有form_for应该自动完成。 -
这不是我想要的,但它确实有效!谢谢你。仅供参考,如果您按照@JustMichael 的建议进行操作,您将提交另一个表单/地图,在这种情况下,名称为“params”。在您的控制器中,只需定义一个接收
def action_to_use(conn, "form" => form, "params" => params等参数的函数,您将获得使用命名空间创建的第二个表单。
标签: elixir phoenix-framework ecto