You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:24:41