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

Rails中如何将表单字段值传递到其他控制器的视图页面

报错根因

form_tag 是 Rails 中不绑定 ActiveRecord 模型的表单辅助方法,不会向块内传入表单构造器对象,你代码中定义的块参数 form 天然为 nil,调用 form.input_field 自然会触发 undefined method 类错误,和模型是否添加 attr_accessor 没有关联。

正确实现步骤

方案1:沿用form_tag实现(最简适配)

  1. 修改products#show页面的表单代码
<%# 使用get方法更符合页面跳转的语义,参数会自动携带到目标页面 %>
<%= form_tag new_order_path, method: :get do %>
  <%# 可选:传递当前商品ID,满足业务中订单关联商品的需求 %>
  <%= hidden_field_tag :product_id, @product.id %>
  <%# 直接使用text_field_tag定义输入框,不需要调用块参数 %>
  <%= text_field_tag :comments, placeholder: "请输入订单备注" %>
  <%= submit_tag "前往创建订单" %>
<% end %>
  1. 调整Orders控制器的new动作,接收传递的参数
    在app/controllers/orders_controller.rb中修改new方法:
def new
  @order = Order.new
  # 接收商品页传递的参数
  @product = Product.find_by(id: params[:product_id])
  @comments = params[:comments]
end
  1. 在orders#new视图中展示数据
<% if @product.present? %>
  <p>下单商品:<%= @product.name %></p>
<% end %>
<% if @comments.present? %>
  <p>用户备注:<%= @comments %></p>
<% end %>

方案2:使用Rails 6推荐的form_with实现(更规范)

form_with是Rails后续版本统一的表单辅助方法,支持传入表单构造器,也方便后续参数统一校验:

  1. 修改products#show页面的表单代码
<%# scope参数会把所有表单参数封装到order参数组中,方便后续统一处理 %>
<%= form_with url: new_order_path, method: :get, scope: :order do |form| %>
  <%= form.hidden_field :product_id, value: @product.id %>
  <%= form.text_field :comments, placeholder: "请输入订单备注" %>
  <%= form.submit "前往创建订单" %>
<% end %>
  1. 调整Orders控制器的new动作,增加参数白名单
def new
  @order = Order.new(order_params)
end

private
# 统一做参数过滤,后续订单创建也可以复用该方法
def order_params
  params.fetch(:order, {}).permit(:comments, :product_id)
end
  1. 在orders#new视图中直接读取order实例的属性即可
<% if @order.product_id.present? %>
  <p>下单商品:<%= Product.find(@order.product_id).name %></p>
<% end %>
<p>用户备注:<%= @order.comments %></p>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:21:01