Padrino与Sequel嵌套属性表单报错求助:undefined method `data'
解决表单报错:undefined method `data' for [:class, "form-horizontal"]:Array
Hey Levi,这个报错我之前踩过一模一样的坑!大概率是你在写表单辅助方法(比如form_with或者form_for)的时候,参数顺序或者格式搞错了——你把设置表单类的数组[:class, "form-horizontal"]直接当成参数传了,而Rails误以为这是要操作的模型对象,试图调用它的data方法,自然就抛出这个错误啦。
先修正表单的核心错误
先看你可能写错的错误示例:
# 错误写法:把HTML类数组直接作为参数传递 <%= form_with [:class, "form-horizontal"], model: @hierarchical_item do |form| %> <!-- 表单内容 --> <% end %>
正确的写法应该是把HTML样式选项放到html哈希参数里,比如用form_with的话:
<%= form_with model: @hierarchical_item, html: { class: "form-horizontal" } do |form| %> <!-- 层级数据字段 --> <div class="form-group"> <%= form.label :parent_id, "父级项目" %> <%= form.collection_select :parent_id, HierarchicalItem.all, :id, :title, include_blank: "无父级", class: "form-control" %> </div> <!-- 多语言内容的嵌套表单 --> <%= form.fields_for :translations do |translation_form| %> <div class="card mb-3"> <div class="card-header"> 语言:<%= translation_form.object.locale.upcase %> </div> <div class="card-body"> <div class="form-group"> <%= translation_form.label :title, "标题" %> <%= translation_form.text_field :title, class: "form-control" %> </div> <div class="form-group"> <%= translation_form.label :description, "描述" %> <%= translation_form.text_area :description, class: "form-control", rows: 3 %> </div> <!-- 如果需要删除翻译项,可以加这个 --> <%= translation_form.check_box :_destroy %> <%= translation_form.label :_destroy, "删除该语言内容" %> </div> </div> <% end %> <%= form.submit "保存项目", class: "btn btn-primary" %> <% end %>
配套的模型与控制器配置
要让这个表单正常工作,你的模型关联和控制器逻辑也得对应上:
1. 层级+多语言模型关联
假设你的主模型叫HierarchicalItem,多语言翻译模型叫HierarchicalItemTranslation:
# app/models/hierarchical_item.rb class HierarchicalItem < ApplicationRecord # 层级关联 belongs_to :parent, class_name: "HierarchicalItem", optional: true has_many :children, class_name: "HierarchicalItem", foreign_key: :parent_id # 多语言关联,允许嵌套属性 has_many :translations, class_name: "HierarchicalItemTranslation", dependent: :destroy accepts_nested_attributes_for :translations, allow_destroy: true end # app/models/hierarchical_item_translation.rb class HierarchicalItemTranslation < ApplicationRecord belongs_to :hierarchical_item # 确保每个语言在同一个项目下唯一 validates :locale, presence: true, uniqueness: { scope: :hierarchical_item_id } validates :title, presence: true end
2. 控制器初始化与参数处理
在new动作里预先生成需要的语言翻译记录,create动作里允许嵌套参数:
# app/controllers/hierarchical_items_controller.rb def new @hierarchical_item = HierarchicalItem.new # 预先生成中文、英文的翻译模板,可根据需求调整语言列表 ["zh-CN", "en"].each do |locale| @hierarchical_item.translations.build(locale: locale) end end def create @hierarchical_item = HierarchicalItem.new(hierarchical_item_params) if @hierarchical_item.save redirect_to @hierarchical_item, notice: "层级项目创建成功!" else render :new end end private def hierarchical_item_params params.require(:hierarchical_item).permit( :parent_id, translations_attributes: [:id, :locale, :title, :description, :_destroy] ) end
最后再确认一下
这个报错的核心就是表单辅助方法的参数格式错误——你把HTML类的数组当成了模型对象传递,修正成html: { class: "form-horizontal" }这种哈希格式就能解决。然后再配合正确的模型关联和控制器参数配置,就能顺利创建层级多语言数据的表单啦!
内容的提问来源于stack exchange,提问作者Levi
相关产品推荐
相关产品推荐

