2016-01-20 75 views
2

我想填充一个字段:参数(从模型/架构)这是一个地图。我有一个工作form_for,我想填充:params地图通过复选框,以便当提交表单时,控制器将收到类似于%{... params => %{"param1" => "true", "param2" => "false"}} ...凤凰框架 - 如何通过form_for填充地图字段?

我已经看了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 %> 

因此,而不是具有param1param2这些复选框,我需要获得所有这些参数代入地图。如果使用不同的复选框为参数呈现另一个表单,则它必须填充而与模式没有任何关系。

谢谢!

+1

如果我的问题得到了解决,我认为您只需要为它们生成一个名称空间为“params”的名称属性,例如'<%= checkbox f,:param1,name:“params [param1]” %>'和'<%= checkbox f,:param2,name:“params [param2]”%>'但我相信form_for应该自动完成。 – JustMichael

+0

这不完全是我想要的,但它的工作原理!谢谢。仅供参考,如果您按照@JustMichael的建议进行操作,则会提交另一个表单/映射,在本例中为名称“params”。在你的控制器中,只需定义一个接收params的函数,例如'def action_to_use(conn,“form”=> form,“params”=> params'),​​你将得到你用命名空间创建的第二个表单。 –

回答

0

其实,我想,如果在这样的情况:

schema "checkmapss" do 
    field :name, :string 
    field :options, :map 

    timestamps() 
    end 

我们只是需要做的是在form.html.eex:

<div class="form-group"> 
    <%= label f, :options, class: "control-label" %> 
    <%= text_input f, :options_one, name: "checkmap[options][one]", class: "form-control" %> 
    <%= error_tag f, :options %> 
    </div> 
    <div class="form-group"> 
    <%= label f, :options, class: "control-label" %> 
    <%= text_input f, :options_two, name: "checkmap[options][two]", class: "form-control" %> 
    <%= error_tag f, :options %> 
    </div> 

然后变更功能将帮助我们完成其他的事情。