🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Ruby on Rails

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

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

1613閲覧

Google Natural Language API導入 本番環境でNameErrorが出てしまいます

ooaai

総合スコア17

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Ruby on Rails

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

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2021/03/03 14:38

rails 5.2.4
開発環境 AWS cloud9

【機能】
・クチコミ投稿
投稿した内容をGoogle Natural Language API(自然言語処理)を使ってスコアを取得し、そのスコアによって文字の色を変えるような記述をしています。

開発環境では問題なく動作するのですが、クチコミ投稿時に本番環境だと下記エラーが出てしまいます。
NameError (uninitialized constant ReviewsController::Language):
コントローラのcreateアクションにある
review.score = Language.get_data(review_params[:comment])
の部分にエラーが出ているみたいです。

エラーの意味を調べるとクラスが定義されていない??とあります。
エラーの感じだとAPI関連の記述、設定に問題があるのではないかということまで想像がつくのですが、どこに原因があるのか検討がつかないです。アドバイスいただければと思います。

・APIキーを記述した.envファイルを本番環境(EC2)へアップロード済
・本番環境でrails db:migrate実行済み

schema.rb↓

create_table "reviews", force: :cascade do |t| t.integer "room_id", null: false t.float "star", null: false t.string "name", null: false t.text "comment" t.integer "sex", default: 0, null: false t.integer "age", default: 0, null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false t.decimal "score", precision: 5, scale: 3 #API導入に伴い追加

reviews_controller.rb↓

def create review = Review.new({ room_id: review_params[:room], star: review_params[:star], comment: review_params[:comment], name: review_params[:name], age: review_params[:age], sex: review_params[:sex] }) review.score = Language.get_data(review_params[:comment]) #API導入に伴い追加 review.save redirect_to reviews_path end def index @reviews = Review.all.order(id: "DESC").page(params[:page]).per(10) @review = Review.new end private def review_params params.require(:review).permit(:star, :name, :comment, :age, :sex, :room) end

lib/language.rb↓

require 'base64' require 'json' require 'net/https' module Language class << self def get_data(text) api_url = "https://language.googleapis.com/v1beta1/documents:analyzeSentiment?key=#{ENV['GOOGLE_API_KEY']}" params = { document: { type: 'PLAIN_TEXT', content: text } }.to_json uri = URI.parse(api_url) https = Net::HTTP.new(uri.host, uri.port) https.use_ssl = true request = Net::HTTP::Post.new(uri.request_uri) request['Content-Type'] = 'application/json' response = https.request(request, params) response_body = JSON.parse(response.body) if (error = response_body['error']).present? raise error['message'] else response_body['documentSentiment']['score'] end end end end

config/application.rb

require_relative 'boot' require 'rails/all' # Require the gems listed in Gemfile, including any gems # you've limited to :test, :development, or :production. Bundler.require(*Rails.groups) module Hotel class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. config.load_defaults 5.2 config.time_zone = 'Asia/Tokyo' config.autoload_paths += Dir.glob("#{config.root}/lib")  #API導入に伴い追加 # Settings in config/environments/* take precedence over those specified here. # Application configuration can go into files in config/initializers # -- all .rb files in that directory are automatically loaded after loading # the framework and any gems in your application. end end

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

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

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

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

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

guest

回答1

0

自己解決

コントローラからLanguageを呼び出せていなかった
本番環境だとconfig/application.rbに追加したautoload_pathsを読み込んでくれないのが原因だったためconfig.paths.add 'lib', eager_load: trueを追加することで解決しました

参考にしたページ↓
https://programming-beginner-zeroichi.jp/articles/170

投稿2021/03/04 12:46

ooaai

総合スコア17

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問