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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。