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

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

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

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

Q&A

解決済

2回答

6422閲覧

Ruby on rails】gem:kaminariを使用したページネーションでのエラー解決方法

Tomoaki_Fukuda

総合スコア75

Ruby on Rails 4

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

0グッド

2クリップ

投稿2016/10/31 22:45

###前提・実現したいこと
Ruby on railsにてイベント一覧が表示されるシステムを作っています。
イベント一覧を表示する際にページネーションの機能を実装するため、「kaminari」のgemを導入しましたが、下記のエラーメッセージが表示されてしまい困っております。
是非ともアドバイス頂きたくお願い申し上げます。

###発生している問題・エラーメッセージ
NoMethodError in Home#top
Showing /Users/TOMOAKI/app/views/home/top.html.erb where line #23 raised:

undefined method `total_pages' for #Event::ActiveRecord_Relation:0x007f9be1031248
Extracted source (around line #23):

<h2>イベントの一覧</h2> <%= render @events %> <%= paginate @events %> </ul>

<% else %>

###こちらもご確認下さい。
https://gyazo.com/bc2aa6e0457c2948ac679384a753839c

###top.html.erb

ruby

1 2<% if user_signed_in? %> 3 <aside class="sidebar"> 4 <%= search_form_for @q do |f| %> 5 6 <div class="form-group"> 7 <%= f.label :name_cont, 'イベント名' %> 8 <%= f.text_field :name_cont, class: 'form-control' %> 9 </div> 10 <div class ="form-group"> 11 <%= f.label :start_time_gteq, '開催日' %> 12 <div> 13 <%= f.date_select :start_time_gteq, prompt:true %> 14 </div> 15 </div> 16 <%= f.submit '検索', class: 'byn btn-default' %> 17 <% end %> 18 19 </aside> 20 21 <ul class="notes"> 22 <h2>イベントの一覧</h2> 23 <%= render @events %> 24 <%= paginate @events %> 25 </ul> 26 27<% else %> 28 <div class="top-wrapper"> 29 <%= image_tag "gatebook_cover.png" %> 30 <div class="register-wrapper"> 31 <h1><%= @message %></h1> 32 <%= link_to "新規登録", new_user_registration_path, class: "btn btn-large register-btn" %> 33 </div> 34 </div> 35<% end %>

###home_controller.rb

ruby

1class HomeController < ApplicationController 2 3PER = 3 4 5def top 6 if user_signed_in? 7 @note = Note.new 8 @notes = Note.all.order(created_at: :desc) 9 #@event = Event.new 10 #@events = Event.all.order(created_at: :desc) 11 @event = Event.new 12 @events = Event.all.order(created_at: :desc).page(params[:page]).per(PER) 13 @user = User.new 14 @q = Event.ransack(params[:q]) 15 @events = @q.result(distinct: true) 16 else 17 @message = "ようこそプロトタイプサイトへ!" 18 end 19 end 20 21def index 22@q = Event.ransack(params[:q]) 23@events = @q.result(distinct: true) 24end 25 26private 27 28def search_params 29 params.require(:q).permit! 30 resocue 31 { start_time_gteq: Time.zone.now } 32 end 33 34 def about 35 end 36 37 include ApplicationHelper 38end

###events_controller.rb

ruby

1class EventsController < ApplicationController 2 before_action :authenticate_user! 3 before_action :correct_user, only: [:edit, :update] 4 before_action :set_event, only: [:show, :edit, :update, :destroy] 5 include ApplicationHelper 6 7 def show 8 end 9 10 def index 11 @events = Event.all 12 end 13 14 def new 15 event = Event.new 16 end 17 18 def create 19 @event = current_user.events.build(event_params) 20 if @event.save 21 redirect_to @event, notice: "投稿が保存されました" 22 else 23 # @notesを定義してください 24 @events = Event.all.order(created_at: :desc) 25 # renderメソッドで表示するビューが、views/home/top.html.erbになるように変更してください 26 render 'home/top' 27 28 end 29 end 30 31 def edit 32 end 33 34 def update 35 file = params[:event][:image] 36 @event.set_eventimage(file) 37 38 if @event.update(event_params) 39 redirect_to @event, notice: 'ユーザー情報が更新されました' 40 else 41 render :edit 42 end 43 end 44 45 def destroy 46 @event.destroy 47 redirect_to root_path 48 end 49 50 private 51 52 def set_event 53 @event = Event.find(params[:id]) 54 end 55 56 def event_params 57 params.require(:event).permit(:name, :place, :start_time, :end_time, :content, :image) 58 end 59 60 def correct_user 61 event = Event.find(params[:id]) 62 if !current_user?(event.user) 63 redirect_to root_path, alert: '許可されていないページです' 64 end 65 end 66 67end 68

###event.rb

ruby

1class Event < ActiveRecord::Base 2 3validates :user_id, presence: true 4validates :name, presence: true 5validates :place, presence: true, length: { maximum: 100 } 6validates :content, presence: true, length: { maximum: 2000 } 7validate :start_time 8validate :end_time 9validate :start_time_should_be_before_end_time 10 11belongs_to :user 12 13paginates_per 3 14 15private 16 17def start_time_should_be_before_end_time 18 return unless start_time && end_time 19 20 if start_time >= end_time 21 errors.add('開始時間は終了時間よりも前に設定してください') 22 end 23end 24 25def set_eventimage(file) 26 if !file.nil? 27 file_name = file.original_filename 28 File.open("public/event_images/#{file_name}", 'wb'){|f| f.write(file.read)} 29 self.image = file_name 30 end 31end 32 33 34end

###Gemfile

ruby

1source 'https://rubygems.org' 2 3# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' 4gem 'rails', '4.2.5' 5# Use sqlite3 as the database for Active Record 6gem 'sqlite3' 7# Use SCSS for stylesheets 8gem 'sass-rails', '~> 5.0' 9# Use Uglifier as compressor for JavaScript assets 10gem 'uglifier', '>= 1.3.0' 11# Use CoffeeScript for .coffee assets and views 12gem 'coffee-rails', '~> 4.1.0' 13# See https://github.com/rails/execjs#readme for more supported runtimes 14# gem 'therubyracer', platforms: :ruby 15 16# Use jquery as the JavaScript library 17gem 'jquery-rails' 18# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks 19gem 'turbolinks' 20# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder 21gem 'jbuilder', '~> 2.0' 22# bundle exec rake doc:rails generates the API under doc/api. 23gem 'sdoc', '~> 0.4.0', group: :doc 24 25# Use ActiveModel has_secure_password 26# gem 'bcrypt', '~> 3.1.7' 27 28# Use Unicorn as the app server 29# gem 'unicorn' 30 31# Use Capistrano for deployment 32# gem 'capistrano-rails', group: :development 33 34group :development, :test do 35 # Call 'byebug' anywhere in the code to stop execution and get a debugger console 36 gem 'byebug' 37end 38 39group :development do 40 # Access an IRB console on exception pages or by using <%= console %> in views 41 gem 'web-console', '~> 2.0' 42 43 # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring 44 gem 'spring' 45source 'http://rubygems.org' 46gem 'hirb' 47gem 'devise', '3.5.1' 48gem 'kaminari' 49gem 'bootstrap-sass', '3.2.0.0' 50gem 'ransack' 51 52end 53 54

その他必要な情報があればご教示願います。
よろしくお願いいたします。
以上

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

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

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

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

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

guest

回答2

0

ベストアンサー

ruby

1class HomeController < ApplicationController 2 3def top 4 : 5 @events = Event.all.order(created_at: :desc).page(params[:page]).per(PER) 6 # ここで page してるのに。。。 7 @user = User.new 8 @q = Event.ransack(params[:q]) 9 @events = @q.result(distinct: true) 10 # こっちで上書きしちゃってる 11 else 12 :

のが原因ではないかと思われます。


ransackは使った事がないのでアレですが、例外メッセージから想像するに

ruby

1class HomeController < ApplicationController 2 3def top 4 : 5 # @events = Event.all.order(created_at: :desc).page(params[:page]).per(PER) 6 # こっちは消して 7 @user = User.new 8 @q = Event.ransack(params[:q]) 9 @events = @q.result(distinct: true).order(created_at: :desc).page(params[:page]).per(PER) 10 # こっちにつけちゃう 11 else 12 :

でいいんじゃないかなぁと思います。たぶん。

投稿2016/10/31 22:49

編集2016/10/31 23:01
hana-da

総合スコア1728

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

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

Tomoaki_Fukuda

2016/10/31 22:54

早速の誠にご回答ありがとうございます。 @events = @q.result(distinct: true) # こっちで上書きしちゃってる 上記は「ransack」での検索機能の実装コードなのですが、ページネーションと両立させるためにはどのようなコードを書けばよいでしょうか・・・? 基本的なことで申し訳ないございませんが、ご教示頂けますと幸いです。
hana-da

2016/11/01 07:21 編集

ご自分で色々やってみると勉強になると思うんですが。。。。 追記しておきました
Tomoaki_Fukuda

2016/11/13 23:43

追記頂きましてありがとうございました。 アドバイス頂いた内容でとりあえず検索画面が表示出来るようになりました。 ご丁寧にご対応頂き、感謝申し上げます。
guest

0

kaminariなら
Event.all.order(created_at: :desc).page(params[:page]).per(PER)のallはいらないと思います
.page(params[:page])でallの代わりになっているので

投稿2016/11/08 03:11

VerfolgungEin

総合スコア147

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

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

Tomoaki_Fukuda

2016/11/13 23:44

ご指摘ありがとうございます。この部分は現在コメント「#」をつけておりますが、大変参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問