Rails生产环境仅出现ActionController::UnknownFormat问题求助
解决Rails生产环境下AJAX请求406 Not Acceptable错误(remote: true失效)
看起来你遇到了Rails开发与生产环境AJAX行为不一致的典型问题——406错误说明服务器无法返回请求期望的格式,导致原本的异步请求变成了整页重定向。我来帮你一步步排查解决:
1. 确认UJS在生产环境正确加载
remote: true的核心依赖是Rails UJS(Unobtrusive JavaScript),开发环境下资产动态加载不会出问题,但生产环境是预编译模式,很可能这里掉了链子:
- 打开
app/assets/javascripts/application.js,确保包含UJS依赖(Rails 5+用rails-ujs,Rails 4及以下用jquery_ujs)://= require rails-ujs - 登录生产服务器,重新预编译资产:
编译完成后检查RAILS_ENV=production rake assets:precompilepublic/assets目录,确认包含check.js相关的编译文件。
2. 修正控制器的格式响应逻辑
406错误的直接原因是服务器找不到匹配请求格式的响应。生产环境下浏览器发送的Accept头和开发环境有细微差异,你可以调整控制器的respond_to块,确保覆盖所有可能的情况:
def check notice = "NOTICE!" respond_to do |format| # 用实例变量传递内容,避免AJAX请求中flash传递的潜在问题 format.js { @notice = notice } # 可选:添加html格式作为降级方案,防止意外重定向出错 format.html { redirect_to main_path, notice: notice } end end
同时修改check.js.erb,改用实例变量渲染内容(j是escape_javascript的简写,防止特殊字符破坏JS语法):
$("#notice").html('<p style="color: green;"><%= j @notice %></p>').show().delay(5000).hide(0);
3. 检查生产环境配置项
打开config/environments/production.rb,确认以下配置:
config.assets.debug = false:生产环境必须保持这个设置,确保资产是合并编译状态config.assets.compile = false:生产环境建议关闭这个选项,完全依赖预编译的资产文件
4. 验证路由与请求方法匹配
在生产服务器运行RAILS_ENV=production rake routes,确认app_check_path对应的HTTP方法(POST)和控制器方法完全匹配。另外可以查看页面源代码,确认按钮的formaction属性指向的路径是否正确。
按照这些步骤排查后,生产环境下的AJAX请求应该就能正常触发check.js.erb,无需整页重定向就能显示提示消息了。
内容的提问来源于stack exchange,提问作者boated_tw
相关产品推荐
相关产品推荐

