質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

2回答

4373閲覧

Ruby on Rails、 Infinite Scrollとkaminariを使用して無限スクロールの実装について

riamk

総合スコア47

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

2グッド

3クリップ

投稿2017/05/26 13:31

編集2017/05/27 23:59

###前提・実現したいこと
http://ruby-rails.hatenadiary.com/entry/20141115/1416021886

こちらのサイトを参考にrailsアプリケーションにInfinite Scrollkaminariを使用して無限スクロールの実装をしました。

手順通り1から全て実装してみました。

ですが、最後挙動を確認してみると

このようにページを遷移するリンクが表示されるだけで無限スクロールにはなりませんでした。

このような場合、原因はどこにあるのでしょうか?

どこか間違っている箇所などあれば教えてください。

###該当のソースコード
shops_controller.rb

ruby

1class ShopsController < ApplicationController 2 before_action :set_shop, only: [:show, :edit, :update, :destroy] 3 4 # GET /shops 5 # GET /shops.json 6 def index 7 @shops = Shop.page(params[:page]).per(2) 8 end 9 10 # GET /shops/1 11 # GET /shops/1.json 12 def show 13 end 14 15 # GET /shops/new 16 def new 17 @shop = Shop.new 18 end 19 20 # GET /shops/1/edit 21 def edit 22 end 23 24 # POST /shops 25 # POST /shops.json 26 def create 27 @shop = Shop.new(shop_params) 28 29 respond_to do |format| 30 if @shop.save 31 format.html { redirect_to @shop, notice: 'Shop was successfully created.' } 32 format.json { render :show, status: :created, location: @shop } 33 else 34 format.html { render :new } 35 format.json { render json: @shop.errors, status: :unprocessable_entity } 36 end 37 end 38 end 39 40 # PATCH/PUT /shops/1 41 # PATCH/PUT /shops/1.json 42 def update 43 respond_to do |format| 44 if @shop.update(shop_params) 45 format.html { redirect_to @shop, notice: 'Shop was successfully updated.' } 46 format.json { render :show, status: :ok, location: @shop } 47 else 48 format.html { render :edit } 49 format.json { render json: @shop.errors, status: :unprocessable_entity } 50 end 51 end 52 end 53 54 # DELETE /shops/1 55 # DELETE /shops/1.json 56 def destroy 57 @shop.destroy 58 respond_to do |format| 59 format.html { redirect_to shops_url, notice: 'Shop was successfully destroyed.' } 60 format.json { head :no_content } 61 end 62 end 63 64 private 65 # Use callbacks to share common setup or constraints between actions. 66 def set_shop 67 @shop = Shop.find(params[:id]) 68 end 69 70 # Never trust parameters from the scary internet, only allow the white list through. 71 def shop_params 72 params.require(:shop).permit(:name, :zipcode, :address, :tel) 73 end 74end

index.hetml.erb

ruby

1<p id="notice"><%= notice %></p> 2 3<h1>Listing Shops</h1> 4 5<table id="shops"> 6 <thead> 7 <tr> 8 <th>Name</th> 9 <th>Zipcode</th> 10 <th>Address</th> 11 <th>Tel</th> 12 <th colspan="3"></th> 13 </tr> 14 </thead> 15 16 <tbody class="page"> 17 <%= render @shops %> 18 </tbody> 19</table> 20 21<br> 22 23<%= link_to 'New Shop', new_shop_path %> 24 25<%= paginate @shops %>

_shop.hetml.erb

ruby

1<tr class="shop"> 2 <td><%= shop.name %></td> 3 <td><%= shop.zipcode %></td> 4 <td><%= shop.address %></td> 5 <td><%= shop.tel %></td> 6 <td><%= link_to 'Show', shop %></td> 7 <td><%= link_to 'Edit', edit_shop_path(shop) %></td> 8 <td><%= link_to 'Destroy', shop, method: :delete, data: { confirm: 'Are you sure?' } %></td> 9</tr>

index.js.erb

ruby

1$("#shops").append("<tbody class='page'><%= escape_javascript(render(@posts)) %></tbody>");

shops.coffee

ruby

1$ -> 2 $("#shops .page").infinitescroll 3 loading: { 4 img: "http://www.mytreedb.com/uploads/mytreedb/loader/ajax_loader_blue_48.gif" 5 msgText: "ロード中..." 6 } 7 navSelector: "nav.pagination" # selector for the paged navigation (it will be hidden) 8 nextSelector: "nav.pagination a[rel=next]" # selector for the NEXT link (to page 2) 9 itemSelector: "#shops tr.shop" # selector for all items you'll retrieve

よろしくお願いします。

ooo👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

初めまして。

僕も同じようにやってみましたが同じように動きませんでした。
一つ一つ確認したところ、質問者様が参考にされたサイトでJavaScriptのinfinite scrollをダウンロードする場所のリンクが切れているようです。

間違い(リンク切れ)

curl -k -o vendor/assets/javascripts/jquery.infinitescroll.js https://raw.githubusercontent.com/paulirish/infinite-scroll/master/jquery.infinitescroll.js

修正後

curl -k -o vendor/assets/javascripts/jquery.infinitescroll.js https://cdnjs.cloudflare.com/ajax/libs/jquery-infinitescroll/2.1.0/jquery.infinitescroll.min.js

ちなみにcurlコマンドの意味は以下のとおりです。

curl -k -o [ここにファイルを保存するよ] [ここからダウンロードしたものを]

今回は[ここからダウンロードしたものを]の部分がリンク切れになっていたので、infinite scrollの呼び出しに失敗していたというわけです!

ちみに、もう一回そのコマンド叩いちゃってると思いますが、もう一回やっても問題ないのでやってみてください。

確認手順としては
①あれ?これ動いてないな。jquery本当に読み込まれてるかな?
macの場合 command + I でchromeのconsoleを開く
イメージ説明

consoleタブが真っ赤でエラーが出てる!
真っ赤な部分のエラー内容は

Uncaught SyntaxError: Unexpected token : jquery.infinitescroll.self-395408a….js?body…:1

ふむふむ、jquery.infinitescrollでエラーが出てるな、ファイル名クリックしてみてみよう。

イメージ説明

ん?404 NOT FOUNDだ。
なにこれファイルの中身ないじゃん。

curlでダウンロードした先のファイルあるのかな?ダウンロード先をブラウザ見てみよう。
イメージ説明

あれ、ないじゃん。
あーこれ古い記事だからその頃はあったけど、今はもう消されてるんだなぁ。
じゃあ違うところからファイル持ってきてcurlコマンド使っちゃおう!

で、ファイルが有るかどうかを調べて見ました。
完成後のファイルをcloud9に上げているのでよかったらご覧になってください!
完成後ファイル
(もしかしたら会員登録が必要かもしれないです_(:3 」∠ )_)

また、infinite scrollの初期仕様上、スクロールして最下部まで行かないと次のロードが始まりません。
つまり、Windowの縦幅が広く、最初の状態よりも長い幅になっているとinfinite scrollが発生しないかもしれないです。
Windowサイズを縦に小さくして確認してみてください。

お役に立てば幸いです!

投稿2017/06/15 06:02

編集2017/06/15 06:03
MasakazuFukami

総合スコア1869

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

riamk

2017/06/15 06:23

ご回答ありがとうございます。 原因の発見の仕方から、解決策、サンプルファイルの提供までして頂きありがとうございます。 早速試してみたいと思います! ありがとうございました!
guest

0

$("#shops").append() # ↑こちらでidを指定しているので、まずは以下のように修正してください # 現在はクラスで発火するようになっているので、これも動かない原因のうちに入るっぽいですね <tr id="shop"> <td><%= shop.name %></td> <td><%= shop.zipcode %></td> <td><%= shop.address %></td> <td><%= shop.tel %></td> <td><%= link_to 'Show', shop %></td> <td><%= link_to 'Edit', edit_shop_path(shop) %></td> <td><%= link_to 'Destroy', shop, method: :delete, data: { confirm: 'Are you sure?' } %></td> </tr>

投稿2017/06/07 02:22

hiyashikyuri

総合スコア388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

riamk

2017/06/07 06:36

ご回答ありがとうございます! 早速ご指摘頂いたように _shop.html.erbファイルの <tr class="shop"> の部分を <tr id="shop"> と修正してみました。 ですが、表示関は変わりはありませんでした。 他に修正してみたほうがいい箇所や問題がありそうな部分があればご指摘頂けると嬉しいです。
hiyashikyuri

2017/06/07 16:31

記事を見てみたら面白そうだったんで僕もちょこっとやってみたんですけど、先ほどの修正は全く関係ありませんでした、すみません;; コピペして試してみた結果なんですけど、index.js.erbが読み込まれていないので、$("#shops")に対してスクロールしたら<tbody>をその都度追加する、つまり無限スクロールの元となる要素が""追加されない""状況になっています 普段railsはAPIモードでしか使用していないので、どうやってjs.erbを読み込ませればいいのかちょっと分かりかねるので、明日時間があれば調べてわかったらまた回答させていただきますね!
riamk

2017/06/08 04:20

なるほど。そうだったんですね。 原因追求していただきありがとうございます。 私もjs.erbを読み込ませるように試みてみます。 もしできたら、こちらで情報共有いたします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問