升级到Rails 6.1后提交评论返回JSON时出现意外跳转问题
Rails 6.1升级后评论提交跳转JSON页面问题解决方案
问题根因
你猜测的render_to_string相关问题不成立,该方法仅负责服务端渲染评论模板片段,和前端跳转行为无关。
触发跳转的核心原因是Rails 6.1调整了form_with的默认配置:
- Rails 6.1之前版本:form_with默认开启
remote: true,走AJAX异步提交,提交后不会跳转页面 - Rails 6.1及之后版本:form_with默认关闭异步提交,等同于普通form标签的同步提交行为,服务端返回JSON时浏览器就会直接渲染JSON内容
解决方案
方案1:单独调整当前表单的提交行为
直接在表单定义中添加local: false参数,强制开启异步提交:
<%= form_with model: Comment.new, id: 'new-comment', local: false do |f| %> <%= f.hidden_field :offer_id, value: @offer.id %> <div> <%= f.text_area :content %> <div class="mt-3 flex items-center justify-between"> <%= f.submit "Comment", id:"comment-button"%> </div> <% end %>
方案2:全局恢复旧版form_with默认行为
如果你的项目大量依赖form_with默认异步提交的特性,可以在全局配置中改回旧版默认逻辑,不需要逐个修改表单:
打开config/application.rb,在class Application < Rails::Application块内添加以下配置:
config.action_view.form_with_generates_remote_forms = true
修改完成后重启Rails服务即可生效。
额外优化建议
你当前控制器的create方法存在逻辑缺陷:评论保存失败时仍然返回success: true,会导致前端无法识别错误状态,建议修改为:
else render json: { success: false, errors: @comment.errors.full_messages } end
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

