Rails报错ActionController::UnknownFormat,Ajax表单请求无对应模板排查
解决ActionController::UnknownFormat错误的方案
以下是几个关键修复点,按优先级排序:
1. 修正控制器的参数获取逻辑
由于你用了model: @shopping创建表单,提交的参数会被嵌套在shopping命名空间下,直接取params[:date_start]会拿到nil,同时导致后续逻辑异常。修改控制器代码:
def search_by_dates @date_start = params[:shopping][:date_start] @date_end = params[:shopping][:date_end] @shoppings = Shopping.where(date_shopping: @date_start..@date_end) respond_to do |format| format.html { redirect_to shoppings_path } # 处理非AJAX场景的降级逻辑 format.js end end
注意:建议把控制器动作名改成蛇形命名search_by_dates,这是Rails的约定,避免驼峰带来的模板匹配问题。
2. 匹配动作名的模板文件命名
Rails模板文件需要和控制器动作名保持蛇形命名一致,把你的searchByDates.js.erb重命名为search_by_dates.js.erb,放在app/views/shoppings/目录下。
3. 修正路由定义
更新routes.rb的路由规则,匹配蛇形动作名,并默认指定JS格式:
post 'shoppings/search_by_dates', defaults: { format: 'js' } # 或者用RESTful集合路由的写法: # resources :shoppings do # post :search_by_dates, on: :collection, defaults: { format: 'js' } # end
4. 修正表单的字段属性和URL
表单里的date_field属性写错了,把attribute: 'date'改成type: 'date',同时更新表单的url指向蛇形动作名:
<%= form_with model: @shopping, url: { action: "search_by_dates" }, remote: true do |form| %> <div class="form-group"> <%= form.label :date_start %> <%= form.date_field :date_start, type: 'date' %> <%= form.label :date_end %> <%= form.date_field :date_end, type: 'date' %> </div> <div class="form-group"> <%= form.submit "Cerca", class: 'btn btn-primary' %> </div> <% end %>
5. 验证请求头(可选)
在浏览器开发者工具的Network标签中,查看提交的请求是否包含Accept: text/javascript请求头——remote: true的表单应该自动添加这个头,如果没有,检查是否引入了Rails的UJS脚本(//= require rails-ujs在application.js中)。
内容的提问来源于stack exchange,提问作者Alfredo
相关产品推荐
相关产品推荐

