Rails中如何将表单字段值传递到其他控制器的视图页面
报错根因
form_tag 是 Rails 中不绑定 ActiveRecord 模型的表单辅助方法,不会向块内传入表单构造器对象,你代码中定义的块参数 form 天然为 nil,调用 form.input_field 自然会触发 undefined method 类错误,和模型是否添加 attr_accessor 没有关联。
正确实现步骤
方案1:沿用form_tag实现(最简适配)
- 修改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 %>
- 调整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
- 在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后续版本统一的表单辅助方法,支持传入表单构造器,也方便后续参数统一校验:
- 修改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 %>
- 调整Orders控制器的new动作,增加参数白名单
def new @order = Order.new(order_params) end private # 统一做参数过滤,后续订单创建也可以复用该方法 def order_params params.fetch(:order, {}).permit(:comments, :product_id) end
- 在orders#new视图中直接读取order实例的属性即可
<% if @order.product_id.present? %> <p>下单商品:<%= Product.find(@order.product_id).name %></p> <% end %> <p>用户备注:<%= @order.comments %></p>
内容的提问来源于stack exchange,提问作者yellowreign
相关产品推荐
相关产品推荐

