Rails 4.を使用して、アプリケーションでAjaxを使用しようとします。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)
layouts/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)
Catch:
あなたのコンソールログは言う:
Oweb :: MainController#setmagasinstatusによる処理HTMLとして
コントローラーアクションで、サポートされているHTML応答がありません。そのため、UnknownFormat
のエラーが発生します。
ソリューション:
追加 format: "js"
ajax呼び出しで。例えば:
$.ajax url: "/oweb/main/setmagasinstatus", data: 'id=' + id, format: 'js'
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
[〜#〜] html [〜#〜]
問題は、何らかの理由でHTML
リクエストを送信しているようです:
Oweb :: MainController#setmagasinstatus as HTML
したがって、「不明な形式」エラーは、アクションでのhtml
mime-typeの定義の不足が原因で発生すると思います。これは表面レベルでエラーを解決するのに役立つと思います:
respond_to do |format|
format.js
format.html
end
Ajax
上記が正しい場合、質問は「HTML mime-typeが送信される理由」に変わります。
実際のAjaxコードを表示できないため、問題は次のようになることをお勧めしますどちらか標準のHTTPリクエストを送信しているだけです(ajaxは [〜#〜] xhr [〜#〜] );または、ajaxリクエストの宣言に問題があります
Ajax( Asynchronous Javascript And XML )は、疑似のようにあなたに代わってリクエストを送信するためのものであることを覚えておく必要がありますブラウザ。つまり、ajaxリクエストを送信する場合は、JavaScriptを使用して送信する必要があります(つまり、format.js
mimeタイプハンドラー)
-
個人的には、ajaxリクエストを送信していないと思いますが、dataType
などの別のJSON
を送信している可能性もあります。