【发布时间】:2023-03-14 12:06:01
【问题描述】:
我正在制作一个带有设置页面的 ruby on rails 应用程序,用户可以在其中输入两个字段,一个名称和值字段,将在表单提交时转换为哈希的键和值。
唯一复杂的方面是用户需要能够向此表单添加额外的“行”。当前页面上的表单如下所示:
如您所见,单击“加号”图标将创建另一个“转换操作”,单击“减号”图标将从字段中删除一行。用户应该能够根据需要添加任意数量的转化操作。
从数据库加载此哈希并使用现有值填充表单是非常标准的,但我对当前向表单添加额外表单字段的方式不满意。
这是页面上使用的 HTML 表单的代码:
<%= parent_form.fields_for :conversion_trackers_to_pull do |form| %>
<div id="conversion-trackers-to-pull">
<% section.conversion_trackers_to_pull.each_with_index do |(conversion_tracker_name, conversion_tracker_id), index| %>
<div class="mb-2">
<%= form.fields_for "conversion_tracker_#{index}".to_sym do |conversion_tracker| %>
<%= conversion_tracker.label :conversion_action, "Conversion Action #{index+1}: " %>
<%= conversion_tracker.text_field :name, value: conversion_tracker_name, placeholder: "Name" %>
<%= conversion_tracker.text_field :id, value: conversion_tracker_id, placeholder: "ID" %>
<% end %>
<%= button_tag '<i class="fas fa-minus-circle"></i>'.html_safe, type: "button", class: "remove-conversion-tracker" %>
<span class="index d-none"><%= index + 1 %></span>
</div>
<% end %>
</div>
<i class="far fa-plus-square" id="<%= "#{section_name}" %>-new-conversion-tracker"></i>
<% end %>
这是加号按钮单击事件中使用的 JQuery 代码:
$('#search-new-conversion-tracker').on('click', function() {
var index = parseFloat(($('#search-conversion-trackers-to-pull').find('.index').last().text()));
if (!index) {
index = 0;
}
$(this).prev('#conversion-trackers-to-pull').append(
'<div class="mb-2">' +
'<label for="_search_section_config_conversion_trackers_to_pull_conversion_tracker_' + index + '_conversion_action">Conversion Action ' + (index+1) + ': </label> ' +
'<input type="text" name="[search_section_config][conversion_trackers_to_pull][conversion_tracker_' + index + '][name]" id="_search_section_config_conversion_trackers_to_pull_conversion_tracker_' + index + '_name" placeholder="Name"> ' +
'<input type="text" name="[search_section_config][conversion_trackers_to_pull][conversion_tracker_' + index + '][id]" id="_search_section_config_conversion_trackers_to_pull_conversion_tracker_' + index + '_id" placeholder="ID"> ' +
'<button name="button" type="button" class="remove-conversion-tracker"><i class="fas fa-minus-circle"></i></button>' +
'<span class="index d-none">' + (index + 1) + '</span>' +
'</div>'
);
bindRemoveConversionTracker();
});
所以这个解决方案确实有效,尽管它非常笨重。我知道 Rails 助手可能会在后台做同样的事情,但我需要在其他页面上复制类似类型的表单,我觉得应该有一种更简洁的方法,而不是重复我已经写过的代码得到了。
有没有人有在 Ruby on Rails 中制作这种表单的经验?你用了什么技术?谢谢!
【问题讨论】:
标签: javascript jquery html ruby-on-rails ruby