Ruby On Rails问题:提交表单后控制器未渲染指定页面
问题解决:Rails表单提交后无法加载视图且URL无变化
问题原因
- 控制器强制渲染纯文本:
calc_controller.rb里的render plain: params[:count].inspect语句会直接输出纯文本,跳过了Rails默认的视图模板(calculate.html.erb)渲染流程,导致目标视图无法加载。 - form_with默认AJAX提交:Rails的
form_with默认用Turbo/AJAX异步提交表单,这种方式不会刷新整个页面,所以URL不会变化,异步返回的纯文本也不会自动替换页面内容。
解决方案
1. 修正控制器代码
删除控制器中的render plain:语句,让Rails自动渲染对应的视图模板:
def calculate @count = params[:count] end
2. 处理表单提交方式
有两种可选方案:
- 方案一:强制非AJAX提交(简单直接,适配当前场景)
给form_with添加local: true选项,让表单以传统方式提交,提交后页面会跳转并更新URL:
<%= form_with url: "/calc", method: :get, local: true do |form|%> <%= form.label :count, "Введите количество чисел" %> <%= form.number_field :count %> <%= form.submit "Начать"%> <% end %>
- 方案二:保留AJAX提交并更新页面(适合无刷新需求场景)
若想保留异步提交,需用Turbo Stream更新页面内容。在calc视图目录下创建calculate.turbo_stream.erb文件,内容如下:
<%= turbo_stream.replace "count-container" do %> <h2><%= @count %></h2> <% end %>
同时在表单所在页面添加用于更新的容器:
<div id="count-container"></div>
验证效果
修改完成后提交表单,终端日志会显示类似以下内容,说明视图模板已正常渲染:
Started GET "/calc?count=5&commit=Начать" for ::1 at 2023-01-23 16:51:04 +0300 Processing by CalcController#calculate as HTML Parameters: {"count"=>"5", "commit"=>"Начать"} Rendering layout layouts/application.html.erb Rendering calc/calculate.html.erb within layouts/application Rendered calc/calculate.html.erb within layouts/application (Duration: 0.5ms | Allocations: 123) Rendered layout layouts/application.html.erb (Duration: 2.0ms | Allocations: 456) Completed 200 OK in 3ms (Views: 2.5ms | Allocations: 579)
此时页面会跳转到对应URL,并显示@count的值。
内容的提问来源于stack exchange,提问作者NOVA PC
相关产品推荐
相关产品推荐

