Rails嵌套表单TypeError求助:Symbol无法转为Integer
解决Rails嵌套表单的"no implicit conversion of Symbol into Integer"错误
这个错误我之前嵌套表单开发时也碰到过,核心是嵌套表单的关联配置、字段渲染逻辑出了问题,咱们一步步来修复:
1. 先补全Company模型的关键配置
首先你的Company模型必须明确允许接收用户的嵌套属性,否则Rails无法识别关联参数。打开app/models/company.rb,添加关联和嵌套属性声明:
class Company < ApplicationRecord # 根据你的业务逻辑选has_many或has_one has_many :users # 允许接收users的嵌套属性 accepts_nested_attributes_for :users end
2. 修正控制器的new动作
在new页面加载时,需要预先构建关联的User对象,不然fields_for不会渲染出嵌套的表单字段:
def new @company = Company.new # 构建一个空的user关联对象,让表单能渲染出用户字段 @company.users.build # 如果是has_one关联,就写 @company.build_user end
3. 修复表单partial的渲染和fields_for调用
你当前的partial传参和fields_for用法是错误的,这也是报错的直接原因:
第一步:修改new.html.erb的partial渲染
不需要传递多余的locals参数,直接传入company对象即可:
<%= render partial: 'form', locals: { company: @company } %>
第二步:修改form.html.erb里的fields_for逻辑
fields_for需要接收关联名称(也就是你在model里定义的:users),而不是带_attributes后缀的符号。把这段代码修改:
<%= f.fields_for :users do |user_f| %> <div class="form-group"> <%= user_f.label :email %> <%= user_f.text_field :email, placeholder: 'Your Email Address', class: 'form-control' %> </div> <div class="form-group"> <%= user_f.label :password %> <%= user_f.password_field :password, placeholder: 'Password', class: 'form-control' %> </div> <% end %>
4. 确认参数白名单(你的控制器这里是正确的)
你控制器里的company_params写法没问题,保持原样即可:
def company_params params.require(:company).permit(:name, :location, users_attributes: [:email, :password]) end
报错原因说明
你之前给fields_for传了:users_attributes符号,同时又没预先构建关联的user对象,导致Rails内部处理时错误地把符号当成数组索引来解析,从而抛出了"Symbol无法转成Integer"的类型错误。
按照上面的步骤修改后,嵌套表单应该就能正常创建Company和关联的User了。
内容的提问来源于stack exchange,提问作者Coder
相关产品推荐
相关产品推荐

