Rails多态关联问题:Gym/User关联Address时fields_for不显示
解决多态关联下
fields_for不显示的问题 哈哈,我一眼就瞅到你代码里藏了个致命小bug——模型名写成了Adress,但正确拼写是Address啊!Rails对命名规则特别较真,这大概率是fields_for没反应的核心原因!咱们一步步把问题捋顺:
1. 先修正模型拼写与关联逻辑
Address模型(修正拼写,同步调整关联名)
class Address < ApplicationRecord include AddressTypeAsker # 这里的模块名也要跟着改哦 belongs_to :addressable, polymorphic: true end
Gym模型(修正关联名,保持has_one关联)
class Gym < ApplicationRecord belongs_to :user has_one :address, as: :addressable accepts_nested_attributes_for :address end
User模型(补全多地址关联逻辑)
class User < ApplicationRecord has_many :addresses, as: :addressable accepts_nested_attributes_for :addresses, allow_destroy: true # 要是需要删除地址就加这个 end
2. 控制器里必须初始化关联对象
不管是新建还是编辑Gym,都得在控制器里给地址留好“位置”,不然fields_for找不到关联实例,自然不会渲染:
Gym控制器示例代码
class GymsController < ApplicationController def new @gym = Gym.new @gym.build_address # 关键!给Gym绑定一个空的Address对象 end def edit @gym = Gym.find(params[:id]) # 编辑时如果还没地址,就新建一个 @gym.build_address unless @gym.address.present? end private def gym_params # 一定要允许Address的嵌套参数!不然提交了也白搭 params.require(:gym).permit(:name, :user_id, address_attributes: [:id, :street, :city, :zip_code]) end end
3. 视图里正确调用fields_for
在Gym的表单视图里,注意关联名是:address(因为Gym是has_one关联,不是has_many):
<%= form_with model: @gym do |form| %> <!-- Gym自身的字段 --> <%= form.label :name %> <%= form.text_field :name %> <!-- 嵌套的地址字段 --> <%= form.fields_for :address do |address_form| %> <div class="address-group"> <%= address_form.label :street %> <%= address_form.text_field :street %> <%= address_form.label :city %> <%= address_form.text_field :city %> <%= address_form.label :zip_code %> <%= address_form.text_field :zip_code %> </div> <% end %> <%= form.submit "保存" %> <% end %>
额外提醒
要是给User做多地址的fields_for,记得把关联名改成:addresses,控制器里可以用2.times { @user.addresses.build }这种方式初始化多个空地址~
这样调整完,fields_for应该就能正常显示地址字段啦!
内容的提问来源于stack exchange,提问作者Marcos R. Guevara
相关产品推荐
相关产品推荐

