Подтвердить что ты не робот

ActionController:: UnknownFormat с format.js для реализации ajax (Rail 4)

Я пытаюсь использовать Ajax в своем приложении с Rails 4. Чтобы отправить мои 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)
4b9b3361

Ответ 1

Лови:

В вашем журнале консоли указано:

Обработка Oweb:: MainController # setmagasinstatus как HTML

В действии вашего контроллера вы не поддерживаете ответ HTML. Вот почему вы столкнулись с ошибкой UnknownFormat.

Решение:

Добавьте format: "js" в свой вызов ajax. Например:

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

Ответ 2

Если вы можете использовать вспомогательную функцию link_to для вызова действия вашего контроллера, в вашем случае Oweb::MainController#setmagasinstatus добавление :remote => true в link_to помощник решит проблему.

Например, если у вас есть ссылка на ваше действие и вы хотите получить ответ в ajax, следующий код создаст ссылку на это действие:

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

Вот простой пример https://coderwall.com/p/kqb3xq/rails-4-how-to-partials-ajax-dead-easy

Ответ 3

HTML

Похоже, проблема в том, что вы отправляете запрос HTML по любой причине:

Oweb:: MainController # setmagasinstatus как HTML

Я бы предположил, что ошибка "unkown format" будет вызвана вашим отсутствием определения для mime-типа HTML в вашем действии. Я бы предположил, что это поможет устранить ошибку на уровне поверхности:

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

Ajax

Если вышесказанное верно, вопрос затем переключается на "почему отправляется HTML-тип mime?"

Из-за невозможности увидеть ваш фактический код Ajax, я бы порекомендовал, что проблема будет либо в том, что вы просто отправляете стандартный HTTP-запрос (ajax XHR); или у вас будет проблема с объявлением с запросом ajax

Вы должны помнить, что Ajax ( Асинхронный Javascript и XML) предназначен для отправки запроса от вашего имени - например, псевдобуфера, Это означает, что если вы хотите отправить запрос ajax, это должно быть сделано через Javascript (следовательно, обработчик типа m3)

-

Лично я думаю, что вы не отправляете запрос ajax, хотя также может быть, что вы отправляете другой dataType, например JSON