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

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

ただいまの
回答率

90.54%

  • Ruby on Rails

    8622questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Cloud9

    530questions

    Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

  • URL

    232questions

    URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

  • Redis

    117questions

    Redisは、オープンソースのkey-valueデータストアで、NoSQLに分類されます。すべてのデータをメモリ上に保存するため、処理が極めて高速です。

rails5にredis3.3.2を対応させることができません。

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 724

s.k

score 249

前提・実現したいこと

rails5.0.0でredisを動かしたいです。

先日、rails4.2.6から5.0.0へアップデートしました!
そこで、たくさんエラーがでたので、いろいろ修正しました。

その中で,redisもエラーを起こしていたのですが、
応急措置をしました。ただ、その応急措置はredisを動かさないようにするためのものであって結局はredisに関連するコードを記述しているファイルではエラーを起こしてしまうということに気づきました…

発生している問題・エラーメッセージ

【応急措置までの過程】
rails s -b $IP -p $PORT実行

=> Booting WEBrick
=> Rails 5.0.0 application starting in development on http://0.0.0.0:8080
=> Run `rails server -h` for more startup options
Exiting
/usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/uri/rfc3986_parser.rb:18:in `rescue in split': bad URI(is not URI?):  (URI::InvalidURIError)

ネットで調べたところ、
redis.rbを条件分岐にすれば解決できると書いてありました。

bofore

    require 'redis'

    uri = URI.parse(ENV["REDIS"])
    REDIS = Redis.new(host: uri.host, port: uri.port)

after

if ENV["REDIS"]
    require 'redis'

    uri = URI.parse(ENV["REDIS"])
    REDIS = Redis.new(host: uri.host, port: uri.port)
end

ここから、rails s -b $IP -p $PORT実行

=> Booting WEBrick
=> Rails 5.0.0 application starting in development on http://0.0.0.0:8080
=> Run `rails server -h` for more startup options
[2017-01-23 03:11:26] INFO  WEBrick 1.3.1
[2017-01-23 03:11:26] INFO  ruby 2.3.0 (2015-12-25) [x86_64-linux]
[2017-01-23 03:11:26] INFO  WEBrick::HTTPServer#start: pid=5033 port=8080

起動することができるようになりました。

【応急措置で対応できなかったところ】

しかし、これはredisを起動させないための条件分岐であったようで、
redisを記述しているファイルではエラーが起きてしまいます。

NameError in PageController#rank
uninitialized constant PageController::REDIS

app/controllers/page_controller.rb:21:in `rank'


【page_controller.rb】

  def rank
       ##ランキング
       ★この行★ids = REDIS.zrevrangebyscore "microposts/daily/#{Date.yesterday.to_s}", "+inf", 0, limit: [0, 5], withscores: true
       @rank = ids.map{ |id| Micropost.find(id) }
       if @rank.count < 5
        adding_microposts = Micropost.order(updated_at: :DESC).where.not(id: ids).limit(5 - @rank.count)
        @ranking_microposts = @rank.concat(adding_microposts)
       end

       option
  end

【違う応急措置】

ここで、先ほどとは違う対処を試みました。
最初のエラー内容をもう一度確認。

=> Booting WEBrick
=> Rails 5.0.0 application starting in development on http://0.0.0.0:8080
=> Run `rails server -h` for more startup options
Exiting
/usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/uri/rfc3986_parser.rb:18:in `rescue in split': bad URI(is not URI?):  (URI::InvalidURIError)

URIがおかしいということで、調べると日本語対応していないと発生するエラーだと判明しましたので、gemを使いました。

gem 'addressable', require: 'addressable/uri'

redis.rb(before)

    require 'redis'

    uri = ★URI★.parse(ENV["REDIS"])
    REDIS = Redis.new(host: uri.host, port: uri.port)

redis.rb(after)

    require 'redis'

    uri = ★Addressable::URI★.parse(ENV["REDIS"])
    REDIS = Redis.new(host: uri.host, port: uri.port)

ここで、エラーの内容が変わりよくわからなくなってしまいました…
どうやら、uri変数にうまく値が入っていないようでして…

=> Booting WEBrick
=> Rails 5.0.0 application starting in development on http://0.0.0.0:8080
=> Run `rails server -h` for more startup options
Exiting
/home/ubuntu/workspace/config/initializers/redis.rb:4:in `<top (required)>': undefined method `host' for nil:NilClass (NoMethodError)

ご経験ある方、ご助言お願いします。

補足情報(言語/FW/ツール等のバージョンなど)

redis.3.3.2
rails5.0.0

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

同じタグがついた質問を見る

  • Ruby on Rails

    8622questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Cloud9

    530questions

    Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

  • URL

    232questions

    URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

  • Redis

    117questions

    Redisは、オープンソースのkey-valueデータストアで、NoSQLに分類されます。すべてのデータをメモリ上に保存するため、処理が極めて高速です。