如何在Rails表单中传递字符串数组?邮件数组传递问题求助
解决Rails表单传递邮件数组的问题
你的问题出在表单字段的命名逻辑上:fields_for :members会生成单个members[email]的字段名,循环里的所有复选框都复用这个名称,导致提交后只有一个值被保留。要传递数组,需要让每个复选框的字段名符合Rails的数组参数格式。
解决方案:修改表单字段命名
直接手动构建复选框的name属性为event[members][][email],这样选中的邮件会被打包成数组提交:
<div class="field"> <% @group.list_accepted.each do |part| %> <% user = User.find(part.user_id) %> <%= label_tag "event[members][][email]", user.username %> <%= check_box_tag "event[members][][email]", user.email, false %> <br> <% end %> </div>
优化建议:避免视图中的数据库查询
不要在视图里直接调用User.find,会引发N+1查询性能问题。建议在控制器中预加载关联数据:
# 控制器代码 @group = Group.find(params[:group_id]) @group.list_accepted.includes(:user) # 预加载user关联对象
之后视图可以直接使用关联对象:
<div class="field"> <% @group.list_accepted.each do |part| %> <%= label_tag "event[members][][email]", part.user.username %> <%= check_box_tag "event[members][][email]", part.user.email, false %> <br> <% end %> </div>
强参数配置保持不变
你的强参数写法是正确的,无需修改:
params.require(:event).permit(:title, :description, :user_id, :group_id, :start_date, :end_date, members: [:email])
提交后,params[:event][:members]会变成包含多个{email: "xxx"}哈希的数组,完全符合你需要的数组类型属性要求。
内容的提问来源于stack exchange,提问作者Alessia Volpi
相关产品推荐
相关产品推荐

