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

Rails页面间输入数据无法传递,请求代码问题排查

问题排查与修复方案

我来帮你梳理下代码里的问题,以及对应的修复方法:

核心问题:重定向导致参数丢失

你的act方法里用了redirect_to '/page',这会让浏览器发起一个全新的GET请求访问/page,但POST请求里的params[:field1]并不会被带到这个新请求里——所以当page方法再次执行时,@input = params[:field1]拿到的是nil,自然看不到输入的内容。

另外,初始访问/page时,这是一个GET请求,params[:field1]本来就不存在,@input也会是nil,这也会导致页面初始状态可能不符合预期。

修复方案(两种可选)

方案1:直接渲染模板(推荐)

不需要重定向,在act方法里直接渲染page模板,这样@input的值会被保留下来:

修改pages_controller.rb:

class PagesController < ApplicationController
  def page
    # 初始访问时@input为空,提交后由act方法传递值过来
  end

  def act
    @input = params[:field1]
    # 直接渲染page模板,而不是重定向
    render :page
  end
end

补全page.html.erb的表单代码(你之前的代码没写完,需要确保表单是POST请求且包含输入框):

<%= form_tag({controller: :pages, action: 'act'}, method: :post) do %>
  <%= text_field_tag :field1, @input %>
  <%= submit_tag '展示输入内容' %>
<% end %>

<% if @input.present? %>
  <h3>你输入的内容是:</h3>
  <p><%= @input %></p>
<% end %>

方案2:用Flash存储参数(适合必须重定向的场景)

如果业务逻辑需要重定向,可以把参数存在flash里,这样重定向后依然能获取到值:

修改pages_controller.rb:

class PagesController < ApplicationController
  def page
    @input = flash[:input]
  end

  def act
    flash[:input] = params[:field1]
    redirect_to '/page'
  end
end

对应的page.html.erb代码和方案1一致,这样重定向后@input会从flash里拿到值。

额外小优化

你的路由里post '/act/'末尾的斜杠可以去掉,改成post '/act' => 'pages#act',符合Rails的路由规范,避免不必要的路由匹配问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:57:48