Rails 5应用respond_to报UnknownFormat,点击链接渲染局部视图失败
解决Rails 5中ActionController::UnknownFormat错误(点击链接渲染局部视图)
我来帮你搞定这个问题!之前在Rails 4里能用的Bootstrap标签页逻辑到Rails 5出问题,大概率是请求格式、UJS配置或者响应声明的细节没跟上,咱们一步步排查:
1. 确保请求是JS格式,且UJS生效
首先,你的触发链接必须明确告诉Rails要发起JS格式的AJAX请求:
- 生成链接时要加上
format: :js和data: { remote: true },比如:<%= link_to "加载局部内容", user_path(@user, format: :js), data: { remote: true } %> - 检查
app/assets/javascripts/application.js里是否引入了Rails UJS(Rails 5用的是rails-ujs,替代了Rails 4的jquery-ujs):
要是没加载//= require rails-ujs //= require jquery(如果你的项目还依赖jQuery的话) //= require bootstrap(如果用Bootstrap的话)rails-ujs,remote: true根本不会生效,请求会默认是HTML格式,控制器自然找不到对应的format.js分支。
2. 完善控制器的响应配置
- 在
UsersController顶部明确声明支持的响应格式:class UsersController < ApplicationController respond_to :html, :js # 告诉控制器处理HTML和JS格式的请求 # ...其他代码 def show # 先准备好渲染局部视图需要的实例变量,比如@posts之类的 respond_to do |format| format.html # 默认的HTML响应 format.js { render :show_kwst } # 处理JS请求,渲染对应的js.erb文件 end end end - 确认
app/views/users/show_kwst.js.erb文件存在,并且里面的JS代码正确:
这里的# 假设你要把局部视图渲染到id为"partial-container"的div里 $("#partial-container").html("<%= j render 'users/your_partial_name' %>");j是escape_javascript的简写,必须加上,不然局部视图里的特殊字符会导致JS报错,没法正常渲染。
3. 检查路由是否允许JS格式
默认的resources :users会自动支持所有格式,但如果是自定义路由,要确保允许:format参数:
# routes.rb get 'users/:id', to: 'users#show', format: true
4. 验证responders gem的兼容性
你已经加了responders gem,要确保是兼容Rails 5的版本,Gemfile里应该写:
gem 'responders', '~> 3.0'
然后跑bundle install,重启服务器(很重要!gem安装后不重启可能不生效)。
5. 调试请求格式
如果还是有问题,在UsersController#show里加一行调试代码,看看请求到底是什么格式:
def show puts "当前请求格式:#{request.format}" # 终端会输出请求格式 # ...其他代码 end
如果输出是text/html,说明链接没传对format或者UJS没生效;如果是text/javascript,那再检查控制器的respond_to分支和js.erb文件是否正确。
一般来说,搞定前两步就能解决这个UnknownFormat错误啦!
内容的提问来源于stack exchange,提问作者Slowboy
相关产品推荐
相关产品推荐

