ActionController :: UnknownFormat with format.js for ajax implementation(Rail 4)

我尝试在Rails 4的应用程序中使用Ajax。要将我的js发送到客户端,我使用:

respond_to do |format| format.js end 

在我的控制器中。 但是我的控制器产生了错误“ActionController :: UnknownFormat”。 有人可以帮帮我吗?

main_controller.rb:

 class Oweb::MainController < ApplicationController def index ..... end def setmagasinstatus begin @mag = Magasin.find(params[:id]) if @mag.etatmagasin.lib == 'Ouvert' @mag.etatmagasin = Etatmagasin.where(lib: 'Fermé').first else @mag.etatmagasin = Etatmagasin.where(lib: 'Ouvert').first end rescue ActiveRecord::RecordNotFound logger.error("Attempt to access invalid Magasin #{params[:id]}") redirect_to_index("Invalid Magasin") else @mag.save @mags = Magasin.where(user_id: current_user.id) respond_to do |format| format.js end end end end 

setmagasinstatus.js.erb:

 page.replace_html("bloc_magasin", :partial => "listmagasins", :object => @mags) 

布局/ application.html.slim:

 doctype html html head meta charset="utf-8" meta http-equiv="X-UA-Compatible" content="IE=edge" meta name="viewport" content="width=device-width, initial-scale=1.0" meta name="description" content="" meta name="author" content="" title = yield(:title) = stylesheet_link_tag "application" = csrf_meta_tags body ......... = yield = javascript_include_tag "application" = yield :scripts 

的Gemfile:

 source 'https://rubygems.org' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '4.1.1' group :development do gem 'mysql2' end group :production do gem 'pg' end gem 'sass-rails', '~> 4.0.3' gem 'uglifier', '>= 1.3.0' gem 'coffee-rails', '~> 4.0.0' gem 'therubyracer', platforms: :ruby gem 'jquery-rails' gem 'turbolinks' gem 'jbuilder', '~> 2.0' gem 'sdoc', '~> 0.4.0', group: :doc gem 'spring', group: :development gem 'devise', '~> 3.2.4' gem 'slim-rails', '~> 2.1.4' gem 'bootstrap-sass', '~> 3.1.1.1' gem 'compass-rails', '~> 1.1.7' gem 'simple_form', '~> 3.0.2' gem 'activeadmin', github: 'gregbell/active_admin' gem 'polyamorous', github: 'activerecord-hackery/polyamorous' gem 'ransack', github: 'activerecord-hackery/ransack' gem 'formtastic', github: 'justinfrench/formtastic' gem 'debugger', group: [:development, :test, :production] gem 'geocoder' gem 'gmaps4rails', '~> 2.1.2' 

日志:

 Started GET "/oweb/main/setmagasinstatus?id=3" for 192.168.56.1 at 2014-08-01 06:22:06 +0000 Processing by Oweb::MainController#setmagasinstatus as HTML Parameters: {"id"=>"3"} Completed 406 Not Acceptable in 103ms ActionController::UnknownFormat (ActionController::UnknownFormat): app/controllers/oweb/main_controller.rb:24:in `setmagasinstatus' Rendered /home/vagrant/.rvm/gems/ruby-2.1.1/gems/actionpack-4.1.1/lib/action_dispatch/middleware/templates/rescues/_source.erb (2.1ms) Rendered /home/vagrant/.rvm/gems/ruby-2.1.1/gems/actionpack-4.1.1/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (2.2ms) Rendered /home/vagrant/.rvm/gems/ruby-2.1.1/gems/actionpack-4.1.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (1.1ms) Rendered /home/vagrant/.rvm/gems/ruby-2.1.1/gems/actionpack-4.1.1/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (27.1ms) 

抓住:

你的控制台日志说:

由Oweb :: MainController#setmagasinstatus处理为HTML

在您的控制器操作中,您没有受支持的HTML响应。 这就是你面临UnknownFormat错误的UnknownFormat

解:

在ajax调用中添加format: "js" 。 例如:

 $.ajax url: "/oweb/main/setmagasinstatus", data: 'id=' + id, format: 'js' 

如果你可以使用link_to helper函数调用你的控制器的动作,在你的情况下Oweb::MainController#setmagasinstatus :remote => true to link_to helper将解决问题。

例如,如果您有一个指向您的操作的链接并希望在ajax中获得响应,则以下代码将创建指向该操作的链接:

<%= link_to your_link_name, setmagasinstatus_path(:params), :remote => true %>

这是一个简单易行的样本https://coderwall.com/p/kqb3xq/rails-4-how-to-partials-ajax-dead-easy

HTML

看起来问题是您出于任何原因发送HTML请求:

Oweb :: MainController#setmagasinstatus as HTML

因此,我推测“未知格式”错误是由于您的动作中缺少html mime类型的定义所致。 我想这可以解决表面级别的错误:

  respond_to do |format| format.js format.html end 

阿贾克斯

如果以上是正确的,那么问题就转向“为什么要发送HTML mime类型?”

由于无法看到您的实际Ajax代码,我建议问题是您只是发送标准HTTP请求(ajax是XHR ); 或者你对ajax请求的声明有问题

您必须记住,Ajax( 异步Javascript和XML )是代表您发送请求的 – 就像伪浏览器一样。 这意味着如果你想发送ajax请求,它必须通过Javascript完成(因此format.js mime类型处理程序)

就个人而言,我认为你没有发送ajax请求,虽然也可能是你发送了一个不同的dataType ,比如JSON