turbolinksが邪魔をしていることが多いようです。
ページ遷移をAjaxで行いjs,cssをコンパイルさせないため非常に高速で動いてくれます。
Railsのadsenseが表示されないで検索すると、このturbolinksを無効にする方法がよく掲載されています。
しかしデフォルトで装備されている機能を無効にすることは好ましくありません。
それで、今回は別の方法、根本的に解決する方法,
ミドルウエアのRackを修正する方法を記載します。
まず今回の原因となるCORSについて説明します。
Webアプリケーションのクロスオリジンリソースシェアリング(CORS)のサポートを提供してくれます。
CORS仕様により、WebアプリケーションはJSONPなどの回避策を使用せずにクロスドメインAJAX呼び出しを行うことができます。
ブラウザには、クロスドメイン通信を拒否する仕組みがあります。
これはどういうことかというと、釣り情報をみたいと思って訪問したサイト(オリジン)に悪意のあるJavaScript等が埋め込まれていて、他のサイトへデータを勝手送っていたら困ります。それでオリジンのサイト以外からはデータのやり取りができないように作られています。クロスサイトスクリプティングを防止するためです。
上記を踏まえて、CORSとはオリジン以外のサーバーからデータを取得する仕組みです。W3C が推進している世界標準のルールです。
Google Adsenseなどには大変便利なしくみですね。広告は、Googleが自動で作成しますね。それはオリジンのサイト(ブロガー等)に訪問したユーザーのページに広告を表示するために、Google Adsense のサーバーにアクセスしますね。
CORSをサポートしていないと、これがうまく表示されません。死活問題ですね。
だから必要です。
gem 'rack-cors'
そしてbundle install
config.middleware.insert_before 0, Rack::Cors do
allow do
origins '*'
resource '*', headers: :any, methods: [:get, :post, :options]
end
end
RackはRubyでWEBアプリケーションを開発する時に利用する、ミドルウエアです。
コンピュータの基本的な制御を行うオペレーティングシステム(OS)と、各業務処理を行うアプリケーションソフトウェアとの中間に入るソフトウェアのことです。
ミドルウエアが、アプリケーションの起動・停止・監視などを含めた制御をします。
大切ですね。
で , config.middlewareでミドルウエアスタックに新しくミドルウエアを追加しています。同時に読み込み順位も設定しています。
確認してみます。
//先頭に入っていますね
use Rack::Cors
use Rack::Sendfile
use ActionDispatch::Static
use ActionDispatch::Executor
use ActiveSupport::Cache::Strategy::LocalCache::Middleware
use Rack::Runtime
use Rack::MethodOverride
use ActionDispatch::RequestId
use ActionDispatch::RemoteIp
use Sprockets::Rails::QuietAssets
use Rails::Rack::Logger
use ActionDispatch::ShowExceptions
use WebConsole::Middleware
use ActionDispatch::DebugExceptions
use ActionDispatch::Reloader
use ActionDispatch::Callbacks
use ActiveRecord::Migration::CheckPending
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash
use ActionDispatch::ContentSecurityPolicy::Middleware
use Rack::Head
use Rack::ConditionalGet
use Rack::ETag
use Rack::TempfileReaper
use Warden::Manager
run ThaiDict::Application.routes
必要な箇所にに貼り付ける。
上記の設定が済んでいるので、これだけで表示されます。
CORS良いですね。(^^)