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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 4

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

Q&A

解決済

1回答

8406閲覧

[Rails] ログインしている時と、していない時の表示

riamk

総合スコア47

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 4

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

0グッド

0クリップ

投稿2017/04/03 05:35

###前提・実現したいこと
rails4 ローカル環境
deviseを使用してログイン機能を実装しました。

そこで、トップページとなるtop/inedex.html.erbで<% if user_signed_in? %>を使い、
ログインしてない場合はログイン用のページ
ログインしている場合は自分のトップページ
となるようにしました。

ログインしている場合のトップページで自分のタイムラインを表示して、kaminariを導入してページネーション機能をつけました。

###発生している問題・エラーメッセージ
ページネーション機能をつけて、ログイン時は正常に表示されるのですが、ログアウトすると以下のようなエラーになってしまいます。

NoMethodError at / undefined method `page' for nil:NilClass

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

class TopController < ApplicationController def index @timelines = current_user.try(:timeline).page(params[:page]).per(25).order(created_at: :desc) end end

views/top/index.html.erb

<% if user_signed_in? %> 省略 <h4>タイムライン</h4> <% @timelines.each do |timeline| %> <div class="row timeline-list"> <%= link_to user_path(timeline.user_id) do %> <%= profile_img(timeline.user) %> <% end %> <p class="name"><b><%= timeline.user.name %></b><span class="right-list"><%= time_ago_in_words timeline.created_at %>前</span></p> <%= link_to timeline_path(timeline) do %> <p class="timeline-content"><%= timeline.content %></p> <% end %> </div> <% end %> <%= paginate(@timelines) %> <% else %> 省略 <%= link_to 'ログイン', new_user_session_path %> <%= link_to 'サインアップ', new_user_registration_path %> <% end %>

ログアウト時に、pagenilとなってしまうためエラーになっていると解釈しているのですが、どのように解決すればいいのかが分かりません。

どう修正すればいいか教えて頂ける嬉しいです。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

undefined method `page' for nil:NilClass
はkaminariのライブラリの中で起きています
この場合@timelinesがnilになっていることに起因していると思います。

まあ、それはおいておいて、おそらく根本的な原因は
logout時のリダイレクトが正常に動作していないことが原因だと思います。
controllers/application_controller.rbという作った覚えのない
ファイルがありますので
def after_sign_out_path_for(resource)
methodを定義してそこに、ログインしていない状態で表示されるページへのpath
を指定してください。

application_controller.rb

ruby

1 2def after_sign_out_path_for(resource) 3 not_logined_path 4end

not_logined_pathはログインしていない状態で表示されるページへのpathです。

投稿2017/04/03 06:12

moke

総合スコア2241

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

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

riamk

2017/04/03 06:34

mokeさん、いつもご回答ありがとうございます。 def after_sign_out_path_for(resource) root_path end としてログアウトしてみましたが、エラーは同じように起こってしまいました。 ログインしていない状態もログインしている状態もどちらもtop/indexをトップページにしていて、top/indexの中身を<% if user_signed_in? %>でログイン、非ログイン時で表示させている状況です。
moke

2017/04/03 06:46

ああ、そうですかよく読んでなかったみたいです ではこう書き換えましょうか def index @timelines = current_user.try(:timeline).page(params[:page]).per(25).order(created_at: :desc) if user_signed_in? end
riamk

2017/04/03 10:43

教えて頂いたように書き換えてみたところ syntax error, unexpected tIDENTIFIER, expecting keyword_end ...).order(created_at: :desc) if user_signed_in? ... ^ とエラーになってしまいました。 なんとかエラーを自分で解決しようと検索して調べてみましたがどうすることもできませんでした。
riamk

2017/04/03 10:46

ご迷惑をお掛けしました。 @timelines = current_user.try(:timeline).page(params[:page]).per(25).order(created_at: :desc)if user_signed_in? と、if〜の前のスペースを消してみたところ正常に表示できました! 今回も丁寧にご指導して頂きありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問