如何在 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"}
的散列
我有一个基于 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"}
的散列