如何在单个text_field中提交多个标签作为数组参数
解决方案
可以实现,核心逻辑是前端单输入框用统一分隔符输入多个标签,后端将收到的字符串拆分转为数组存储即可,具体实现步骤如下:
步骤1:修改前端表单代码
把原来的多个text_field替换为单个输入框,示例代码:
<div class="field"> <%= form.label :tags %> <%= form.text_field :tags, placeholder: "多个标签请用英文逗号分隔,例如:运营,全职,远程" %> </div>
步骤2:后端处理字符串转数组
推荐在模型层处理,兼顾新增和编辑场景的逻辑复用,以Vacancy模型为例:
class Vacancy < ApplicationRecord # 重写tags属性的setter,存的时候把字符串转成数组 def tags=(input_value) if input_value.is_a?(String) # 兼容中文逗号、去除空格、过滤空标签 processed_tags = input_value.gsub(',', ',') .split(',') .map(&:strip) .reject(&:empty?) super(processed_tags) else super end end # 重写tags属性的getter,编辑时自动把数组转成逗号分隔的字符串回显到输入框 def tags raw_tags = super() raw_tags.is_a?(Array) ? raw_tags.join(', ') : raw_tags end end
如果不想修改模型,也可以在控制器的参数处理环节转换:
def vacancy_params permitted_params = params.require(:vacancy).permit(:tags, :title, :description) # 补充其他需要允许提交的字段 if permitted_params[:tags].present? permitted_params[:tags] = permitted_params[:tags].gsub(',', ',') .split(',') .map(&:strip) .reject(&:empty?) end permitted_params end
可选优化
可以给输入框增加前端标签预览效果,用户输入后实时渲染已输入的标签,不需要改动提交逻辑即可提升使用体验。
内容的提问来源于stack exchange,提问作者Humayun Naseer
相关产品推荐
相关产品推荐

