如何将嵌套表单中的select_tag转为等价的Rails表单助手?
问题描述
我一直无法将嵌套属性局部视图schedtimerange_form中的select_tag转换为Rails表单助手select,该局部视图用于scheduleevent表单的嵌套属性schedtimeranges中,求等价写法。
原主表单代码
<%= form_with(model: scheduleevent, class: "contents", data: { controller: 'nested-form', nested_form_wrapper_selector_value: '.nested-form-wrapper' }) do |form| %> ... schedtimerange_form start ... <%= select_tag "days[]",options_for_select(Date::DAYNAMES.zip((1..7))), id:"days[]", multiple: true, class: 'multis' %> <% end %>
局部视图调用代码
<template data-nested-form-target="template"> <%= form.fields_for :schedtimeranges, Schedtimerange.new, child_index: 'NEW_RECORD' do |schedtimerange| %> <%= render "schedtimerange_form", form: schedtimerange %> <% end %> </template> <%= form.fields_for :schedtimeranges do |schedtimerange| %> <%= render "schedtimerange_form", form: schedtimerange %> <% end %>
原schedtimerange_form代码
<div data-new-record="<%= form.object.new_record? %>"> <div class="w-full"> <div data-controller="select"> <%= select_tag "days[]",options_for_select(Date::DAYNAMES.zip((1..7))), id:"days[]", multiple: true, class: 'multis' %> </div> </div> <div> <div class="w-full mb-2"> <label class="form_label"><%= t("scheduling_events_new_lbl_starttime") %> </label> <div class="pr-4"><%= form.text_field :start_time, data: { controller: "flatpickr", flatpickr_enable_time: true, flatpickr_no_calendar: true, flatpickr_date_format: "h:i K" }, class: 'form_control', placeholder: "#{t("scheduling_events_new_lbl_starttime")}" %> </div> </div> <div class="w-full mb-4"> <label class="form_label"><%= t("scheduling_events_new_lbl_endtime") %> </label> <div class="pr-4"><%= form.text_field :end_time, data: { controller: "flatpickr", flatpickr_enable_time: true, flatpickr_no_calendar: true, flatpickr_date_format: "h:i K" }, class: 'form_control', placeholder: "#{t("scheduling_events_new_lbl_endtime")}" %> </div> </div> <div class="w-full"> <button type="button" class="font-medium text-red-600 dark:text-red-500 hover:underline" data-action="nested-form#remove">Remove Times</button> </div> </div><%= form.hidden_field :_destroy %> </div>
解决方案
将schedtimerange_form中的select_tag替换为Rails表单助手select,利用嵌套表单的form对象自动生成正确的参数命名,适配嵌套属性结构:
<%= form.select :days, Date::DAYNAMES.zip(1..7), {}, multiple: true, class: 'multis' %>
关键说明:
- 第一个参数
:days对应Schedtimerange模型的属性(需确保模型中days是数组类型,比如用数据库text类型配合serialize :days, Array,或PostgreSQL的array类型) - 第二个参数保留原有的选项生成逻辑
Date::DAYNAMES.zip(1..7) - 第三个参数
{}是选项配置(如include_blank等,无需求则留空) - 第四个参数传递HTML属性,包含
multiple: true和样式类class: 'multis' - Rails会自动生成符合嵌套结构的
name属性(如scheduleevent[schedtimeranges_attributes][0][days][])和正确的id,无需硬编码days[],确保表单提交时参数能正确绑定到嵌套的schedtimeranges对象。
内容的提问来源于stack exchange,提问作者spacerobot
相关产品推荐
相关产品推荐

