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

Rails技术问询:如何从Campaign新建页添加City记录并访问city.name

在Campaign表单中关联创建/编辑City记录的解决方案

嘿,这个需求其实是Rails里很常见的嵌套表单场景,我来一步步帮你搞定它:

第一步:让Campaign模型接受嵌套的City属性

首先得告诉Rails,Campaign可以处理关联City的属性提交。修改你的Campaign模型:

class Campaign < ApplicationRecord
  has_many :cities, dependent: :destroy # 可选但推荐:删除Campaign时自动删掉关联的City
  belongs_to :user
  # 关键配置:允许接受City的嵌套属性,allow_destroy用来支持删除已有City
  accepts_nested_attributes_for :cities, allow_destroy: true
end

第二步:控制器里准备好空的City实例

在new和edit动作里,要确保给@campaign关联至少一个空的City,这样表单才能渲染出输入框:

def new
  @campaign = current_user.campaigns.build
  @campaign.cities.build # 生成一个空的City,表单就能显示输入框了
end

def edit
  # 如果编辑时Campaign还没有关联City,也可以加这行,避免表单没有输入区域
  @campaign.cities.build if @campaign.cities.empty?
end

第三步:修改表单,用fields_for渲染City字段

你之前的表单只处理了Campaign自己的字段,现在要嵌套进City的输入区域,用fields_for来创建City的表单上下文,这样就能访问到city.name了:

<%= form_for @campaign do |f| %>
  <!-- 先放Campaign自己的字段,比如你的Campaign的name -->
  <div class="field">
    <%= f.label :name, '活动名称' %>
    <%= f.text_field :name %>
  </div>

  <!-- 嵌套的City输入区域 -->
  <h3>关联城市</h3>
  <%= f.fields_for :cities do |city_form| %>
    <div class="city-field">
      <!-- 这里就能通过city_form访问City的属性啦 -->
      <%= city_form.label :name, '城市名称' %>
      <%= city_form.text_field :name %>

      <!-- 如果要支持删除已有City,加个复选框(需要模型配置allow_destroy: true) -->
      <% if city_form.object.persisted? %>
        <%= city_form.check_box :_destroy %>
        <%= city_form.label :_destroy, '删除这个城市' %>
      <% end %>
    </div>
  <% end %>

  <!-- 可选:加个按钮动态添加更多城市输入框(需要配合JS) -->
  <%= link_to '添加更多城市', '#', class: 'add-city-btn' %>

  <div class="actions">
    <%= f.submit '保存' %>
  </div>
<% end %>

第四步:配置Strong Parameters

最后别忘了在Campaign控制器里,允许提交的参数包含City的属性,否则Rails会拦截这些参数:

private
def campaign_params
  params.require(:campaign).permit(
    :name, # 这里是Campaign自己的参数,根据你的实际字段调整
    # 允许City的id(编辑时需要)、name,还有_destroy(如果开启了删除功能)
    cities_attributes: [:id, :name, :_destroy]
  )
end

这样一来,用户在Campaign的创建/编辑页面就能直接添加、修改、删除关联的City记录了,提交表单时Rails会自动处理Campaign和City的保存~

内容的提问来源于stack exchange,提问作者Daniel Rusu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:27:52