2016-01-20 76 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> 

然後變更功能將幫助我們完成其他的事情。