如何在ruby后端关联多个表单输入

时间:2017-09-14 06:55:41

标签: html ruby sinatra

我有一个基于Ruby后端构建的应用程序(目前尚未使用Rails,但目前正在使用Sinatra)。

在应用程序中,我有一个用于向人们添加订阅的表单。每个订阅都可以是试用版(在这种情况下,它可以拥有它自己的试用开始日期和结束日期),也可以通过不同方式邮寄出来(即我们可以设置邮寄偏好,以便他们如何邮寄)。

我的表格如下:

subscription options

我想知道的是如何将每个输入与订阅相关联?即每行的所有输入必须相互链接

这是我的HTML(不知道还有什么是必需的,还没有真正的后端。):

<tr>
<th style="vertical-align: top;">Subscriptions</th> 
<td>
    <ul id="subscription-select-list">
        <li class="subscription-select-box">
            <select name="person[subscriptions][]">
                <option value="">Select a subscription</option>
                <% @products.each do |product| %>
                    <optgroup label="<%= product.name %>">
                        <% product.subscriptions.sort_by{|subscription| subscription.name }.each do |subscription| %>
                            <option value="<%= subscription.id %>"><%= subscription.name %></option>
                        <% end %>
                    </optgroup>
                <% end %>
            </select>
            <select name="person[mailing]" id="mailing">
                <option value="">Mailing Preference</option>
                <option value="Cc">Cc</option>
                <option value="BCc">BCc</option>
                <option value="Google Groups">Google Groups</option>
            </select>
            <input type="text" id="trial-start" class="datepicker" name="person[trial][start]" placeholder="Trial Start (DD.MM.YYYY)">
            <input type="text" id="trial-end" class="datepicker" name="person[trial][end]" placeholder="Trial End (DD.MM.YYYY)">
            <img src="/img/add_circle.png" alt="Circular add button" class="add-button">
            <img src="/img/remove_circle.png" alt="Circular add button" class="remove-button" style="display: none;">
        </li>
    </ul>
</td>

我已将第一个选择输入的名称设置为name="person[subscriptions][]"我认为我可以使用它将每行加载到哈希中,如:

{subscription_id: 1, mailing_preference: 'BCc', trial_start: '', trial_end: ''}

这些会加载到数组中,例如[{...}, {...}, ...],可以params[:person][:subscriptions]

进行访问

但我不确定该怎么做,或者这是否是最好的方法。

1 个答案:

答案 0 :(得分:0)

好的,所以我找到了解决方案!

正如我在我的问题中所假设的,它确实涉及name属性。但是,它需要稍微复杂的命名 - 非常感谢来自超现实侦探博客的this blog post教我如何完成!

如果我按如下方式更改名称属性:

订阅选择器:person[subscriptions][][id]
邮寄偏好:person[subscriptions][][mailing]
试用开始:person[subscriptions][][trial][start]
试用期结束:person[subscriptions][][trial][end]

然后它给我一个带有订阅键的params哈希,如"subscriptions"=>[{"name"=>"53", "mailing"=>"Cc", "trial"=>{"start"=>"09/17/2017", "end"=>"09/26/2017"}}, {"name"=>"83", "mailing"=>"BCc", "trial"=>{"start"=>"09/05/2017", "end"=>"09/11/2017"}}, ...]

这正是我所寻找的!

基本上,person[:subscriptions]会在subscriptions哈希中创建一个person密钥。之后的[]表示subscriptions键的值应该是一个数组。在[]中添加更多属性,然后在该数组中创建嵌套哈希。

即。 person[:subscriptions][][:name]会在{"name"=>"53"}数组

中创建类似subscriptions的哈希值