LoginSignup
5
7

More than 5 years have passed since last update.

RailsでAjaxとjs個別読み込み?を試してみた備忘録

Posted at

はじめに

初投稿 & だいぶ既出
備忘録だから許してください〜
FXの現在レート取得APIを一定間隔で叩いてグラフ出したいな〜って思って始めてみました
ホントにこれでいいのか謎なのでツッコミお待ちしております

やること

  • ページロード後、Ajax使って一定間隔でpタグを書き換え
  • jsをコントローラ毎に処理を変える

Ajaxで一定間隔でページ一部ロード

まずこんなコントローラを用意します

xxx_controller.rb
# 大本のページのやつ
def yyy
  @time = Time.now()
end

# ajaxリクエストを受け取って実行するやつ
def ajax_action
  @time = Time.now()
end

setIntervalで5秒毎にAjaxのリクエストをするcoffeescriptを作成

xxx.js.coffee
$ ->
  timer = setInterval ->
    update()
  , 5000

update = ->
  $.ajax
    url: 'xxx/ajax_action'
    type: 'GET'
  return

routesも追加記述(scaffoldで作り始めちゃったのでこんな書き方に)

routes.rb
resources :xxx do
  get "ajax_action", to: "xxx#ajax_action", on: :collection
end

viewをこんな感じにやると完成です
ちなみに最初はerbではなくslimを使ってたのですが、hoge.js.slimがちょっと上手くいかなかったのでerbに戻しました

ajax_action.js.erb
$("#time").html("<%= @time %>");
yyy.html.erb
<p id="time"><%= @time %></p>

これで5秒毎にpタグの部分だけ変わります

jsをコントローラ毎に処理を変える

なんかこんな感じでいっぱいajax書いてたら、一辺に読み込み&実行されて嫌だなって思って、個別でなんとか読み込ませて実行します
なるべく元の状態(rails newした状態)から変えずにやりたかったので、こんな感じ↓の方法をとってみました

jquery.readyselectorってのを使います
https://github.com/Verba/jquery-readyselector
からjquery.readyselector.jsを持ってきて、assets/javascript配下に置きます

application.html.erbのbodyの部分をちょっとだけ変更

application.html.erb
<body class="<%= controller_name -%> <%= action_name -%>">

上で書いたcoffeescriptを次のように変更

xxx.js.coffee
$('.xxx.yyy').ready ->
  timer = setInterval ->

このままでいけるんですが、turbolinksのせいでリンクから飛んできたら動いてくれないので

gem 'jquery-turbolinks'

を入れたらいい感じになるらしいです

参考

http://www.upty.jp/railsandajax-2-create-sample-ajax/
http://blog.hello-world.jp.net/javascript/1673/
http://o.inchiki.jp/obbr/97#toc_4

5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7