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
相关产品推荐
相关产品推荐

