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

How do I associate multiple form inputs on a ruby back-end

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

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

我的表格是这样的:

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

这是我的 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>

我已将第一个 select 输入的名称设置为 name="person[subscriptions][]" 我在想我可以使用它来将每一行加载到散列中,例如:

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

那些将被加载到一个数组中,如 [{...}, {...}, ...],可以作为 params[:person][:subscriptions]

访问

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

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

正如我在问题中假设的那样,它确实涉及名称属性。但是,它需要稍微复杂一些的命名 - 非常感谢来自 Surreal Detective 博客的 this blog post 教我如何完成它!

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

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

然后它给了我一个带有订阅密钥的参数散列,例如 "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]person 散列中创建了一个 subscriptions 键。之后的 [] 表示 subscriptions 键的值应该是一个数组。在 [] 中添加更多属性,然后在该数组中创建嵌套哈希。

person[:subscriptions][][:name] 会在 subscriptions 数组

中创建类似 {"name"=>"53"} 的散列