ActionController:: Unknown format with format.js pour la mise en œuvre d'ajax (Rail 4)

J'essaie D'utiliser Ajax dans mon application avec les Rails 4. Pour envoyer mon js pour le client j'utilise :

   respond_to do |format|
        format.js 
   end

dans mon contrôleur. Mais c'est une erreur générée "ActionController::UnknownFormat" i mon controller. Quelqu'un peut m'aider s'il vous plaît ?

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)

layouts/de l'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'

logs:

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)
14
demandé sur Ahamadi 2014-08-01 11:08:19

3 réponses

Capture:

Votre journal de la console dit:

traitement par L'Ogeb:: MainController#setmagasinstatus comme HTML

dans l'action de votre controller, vous n'avez pas pris en charge la réponse HTML. C'est pourquoi vous faites face à l'erreur de UnknownFormat.

Solution:

Ajouter format: "js" dans votre appel ajax. Par exemple:

$.ajax url: "/oweb/main/setmagasinstatus", data: 'id=' + id, format: 'js'
10
répondu RAJ 2014-08-01 07:49:43

Si vous pouvez utiliser link_to fonction d'aide pour appeler l'action de votre contrôleur, dans votre cas Oweb::MainController#setmagasinstatus ajout :remote => truelink_to helper va résoudre le problème.

par exemple, si vous avez un lien vers votre action et que vous voulez obtenir une réponse en ajax, le code suivant créera le lien vers cette action:

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

Voici une mort facile de l'échantillon https://coderwall.com/p/kqb3xq/rails-4-how-to-partials-ajax-dead-easy

11
répondu alishir 2015-03-02 19:14:11

HTML

on dirait que le problème est que vous envoyez un HTML demande pour quelque raison que ce soit:

Oweb:: MainController#setmagasinstatus as HTML

je suppose que l'erreur "unkown format" sera donc causée par votre manque de définition pour le html mime-tapez dans votre action. J'imagine que cela pourrait aider à résoudre l'erreur à niveau de surface:

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

Ajax

si ce qui précède est correct, la question se tourne alors vers "pourquoi un type mime HTML est-il envoyé?"

en raison de ne pas être en mesure de voir votre code Ajax réel, je recommande le problème sera être que vous êtes juste en envoyant une requête HTTP (ajax est XHR); ou vous avez un problème avec la déclaration auprès de la requête ajax

Vous devez rappelez-vous que Ajax (Javascript et XML asynchrones) est conçu pour envoyer une demande en votre nom -- comme un pseudo navigateur. Cela signifie que si vous voulez envoyer une requête ajax, cela doit être fait par Javascript (d'où le format.js type mime gestionnaire)

--

personnellement, je pense que vous n'envoyez pas de demande ajax, bien qu'il se pourrait aussi que vous envoyiez un autre dataType, comme JSON

6
répondu Richard Peck 2014-08-01 07:44:43