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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

1141閲覧

Railsアプリ内に自作ファイルを入れて実行しようとするとクラスメソッドのエラーが出てしまう

Analgesic

総合スコア14

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2018/06/25 20:52

編集2018/06/26 08:08

前提・実現したいこと

Ruby on Rails で作ったアプリに、bitflyerのビットコイン価格を1分おきに取得してくる機能をつけたいと考えています。価格を取ってくるプログラムファイル(trading.rb)を作り、Ruby on Rails で作ったアプリのフォルダに入れてから実行したところ、

uninitialized constant LastPrice (NameError)

というクラスメソッドのエラーが出てしまいます。
初心者ゆえ、何か根本的な勘違いをしてるかもしれませんが、ご教授いただけると幸いです。

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

Traceback (most recent call last): trading.rb:5:in `<main>': uninitialized constant LastPrice (NameError)

該当のソースコード

trading.rb

ruby

1require 'net/http' 2require 'uri' 3require 'json' 4 5@btcprice = LastPrice.new(id: 1, pair_code: 1, pair_name: "Bitcoin-JPY") 6@btcprice.save 7 8loop do 9 10uri = URI.parse("https://api.bitflyer.jp/v1/getticker") 11 12https = Net::HTTP.new(uri.host, uri.port) 13https.use_ssl = true 14response = https.get uri.request_uri 15 16@btcprice = LastPrice.find(1) 17@btcprice.bitflyer = JSON.parse(response.body)["ltp"] 18@btcprice.save 19 20sleep(60) 21 22end

/app/controllers/last_prices_controller.rb

class LastPricesController < ApplicationController def index end def create @btcpr = LastPrice.new(id: 1, pair_code: 1, pair_name: "Bitcoin-JPY") @btcpr.save redirect_to("/last_prices") end end

試したこと

LastPriceのメソッドを使用しなければ、ビットコイン価格を取得して表示するなどのことは問題なくできるので、bitflyerのAPIうんぬんは関係なさそうです。またRailsアプリ内の.html.erbファイルなどでLastPriceメソッドを使用すると問題なく動くので、LastPriceメソッド自体は定義できているようです。

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

bitflyerのAPIに関するページ
https://lightning.bitflyer.jp/docs/playground
https://lightning.bitflyer.jp/docs#socket.io-2.0-websocket

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

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

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

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

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

maisumakun

2018/06/25 22:22

「LastPrice」はどのように定義していますか?
Analgesic

2018/06/26 08:05

ターミナル上からrails g model LastPrice ....などと打って、それからrails db:migrateと打って定義しました。/app/controllers/last_prices_controller.rbの中身は本文中に追記しました。
guest

回答1

0

ベストアンサー

Railsを前提として動かすコードは、rails runnerから実行させましょう。

単にruby trading.rbのように起動しても、Railsとしての環境読み込みが行われないので、正常に動作しません。

投稿2018/06/26 08:16

maisumakun

総合スコア145183

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

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

Analgesic

2018/06/26 09:14

rails runner trading.rbとして起動しようとしたところ、大量のエラーメッセージが出てきました。本文内容に追記しようとしたところ文字数オーバーで書き込めませんでした。 冒頭の部分は Running via Spring preloader in process 6434 Traceback (most recent call last): 70: from -e:1:in `<main>' 69: from /usr/local/rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require' 68: from /usr/local/rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require' ......というような感じで、末尾の部分は 1: from /usr/local/rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/sqlite3-1.3.13/lib/sqlite3/statement.rb:108:in `block in each' /usr/local/rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/sqlite3-1.3.13/lib/sqlite3/statement.rb:108:in `step': SQLite3::ConstraintException: UNIQUE constraint failed: last_prices.id: INSERT INTO "last_prices" ("id", "pair_code", "pair_name", "created_at", "updated_at") VALUES (?, ?,?, ?, ?) (ActiveRecord::RecordNotUnique) なのですが...。
maisumakun

2018/06/26 09:16

「ActiveRecord::RecordNotUnique」ということで、IDの同じレコードを新規作成しようとしているのが原因のようです。
Analgesic

2018/06/26 10:05

ご指摘を受けてみれば、trading.rbを実行するたび @btcprice = LastPrice.new(id: 1, pair_code: 1, pair_name: "Bitcoin-JPY") @btcprice.save のくだりをやってるわけで、エラーとなるのは当然でした。ケアレスで申し訳ありません。 この2行を削除したところ、期待通りの挙動をしているようです。ありがとうございます。 ただ一点気になるのが、こちらの期待通りに動いているのに、rails runner trading.rbとするたび、最初に必ず Running via Spring preloader in process *****(数字部分は毎回違う) と表示されてしまいます。これは気にしなくてもよいのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問