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

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

ただいまの
回答率

91.35%

  • Ruby on Rails

    5066questions

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

Railsであるモデルをnewするとinvalid byte sequence in UTF-8と怒られる

受付中

回答 1

投稿 2017/11/23 01:41

  • 評価
  • クリップ 1
  • VIEW 50
退会済みユーザー

退会済みユーザー

あるモデルをnewした時にinvalid byte sequence in UTF-8といわれます

ecサイトを作成しています

Staffのnamespace配下の全部で20ほどあるコントローラーの内、一つの挙動が異なっているようです
staff/marchandiseというコントローラーのnewアクションでmarchandiseモデルをnewすると

ArgumentError in Staff::MarchandiseController#new(標準のエラー画面である赤い帯に白字。このエラーだとなぜかbetter_errorの画面にならない)
invalid byte sequence in UTF-8
と表示されます

スタッフメンバーがmarchandiseを登録するという設計で、newへのリンクを押すとこのエラーが表示されます
リレーションはstaff_member 1:n marchandise です

よくあるユーザーと投稿の組み合わせをイメージしてもらえればと思います

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

コンソールには以下が表示されています
I, [2017-11-23T00:55:42.774069 #14189]  INFO -- : Completed 500 Internal Server Error in 27342ms (ActiveRecord: 1.4ms)
F, [2017-11-22T22:34:31.940160 #81045] FATAL -- :
F, [2017-11-22T22:34:31.940389 #81045] FATAL -- : ArgumentError (invalid byte sequence in UTF-8):
F, [2017-11-22T22:34:31.940475 #81045] FATAL -- :
F, [2017-11-22T22:34:31.940560 #81045] FATAL -- : invalid byte sequence in UTF-8
better_errors (2.1.1) lib/better_errors/raised_exception.rb:59:in `massage_syntax_error'
better_errors (2.1.1) lib/better_errors/raised_exception.rb:15:in `initialize'
better_errors (2.1.1) lib/better_errors/error_page.rb:19:in `new'
better_errors (2.1.1) lib/better_errors/error_page.rb:19:in `initialize'
better_errors (2.1.1) lib/better_errors/middleware.rb:86:in `new'
better_errors (2.1.1) lib/better_errors/middleware.rb:86:in `rescue in protected_app_call'
better_errors (2.1.1) lib/better_errors/middleware.rb:84:in `protected_app_call'
better_errors (2.1.1) lib/better_errors/middleware.rb:79:in `better_errors_call'
better_errors (2.1.1) lib/better_errors/middleware.rb:57:in `call'
actionpack (5.1.4) lib/action_dispatch/middleware/debug_exceptions.rb:59:in `call'
web-console (3.5.1) lib/web_console/middleware.rb:135:in `call_app'
web-console (3.5.1) lib/web_console/middleware.rb:28:in `block in call'
web-console (3.5.1) lib/web_console/middleware.rb:18:in `catch'
web-console (3.5.1) lib/web_console/middleware.rb:18:in `call'
actionpack (5.1.4) lib/action_dispatch/middleware/show_exceptions.rb:31:in `call'
railties (5.1.4) lib/rails/rack/logger.rb:36:in `call_app'
railties (5.1.4) lib/rails/rack/logger.rb:26:in `call'
sprockets-rails (3.2.1) lib/sprockets/rails/quiet_assets.rb:13:in `call'
actionpack (5.1.4) lib/action_dispatch/middleware/remote_ip.rb:79:in `call'
actionpack (5.1.4) lib/action_dispatch/middleware/request_id.rb:25:in `call'
rack (2.0.3) lib/rack/method_override.rb:22:in `call'
rack (2.0.3) lib/rack/runtime.rb:22:in `call'
activesupport (5.1.4) lib/active_support/cache/strategy/local_cache_middleware.rb:27:in `call'
actionpack (5.1.4) lib/action_dispatch/middleware/executor.rb:12:in `call'
actionpack (5.1.4) lib/action_dispatch/middleware/static.rb:125:in `call'
rack (2.0.3) lib/rack/sendfile.rb:111:in `call'
rack-mini-profiler (0.10.5) lib/mini_profiler/profiler.rb:282:in `call'
railties (5.1.4) lib/rails/engine.rb:522:in `call'
puma (3.10.0) lib/puma/configuration.rb:225:in `call'
puma (3.10.0) lib/puma/server.rb:605:in `handle_request'
puma (3.10.0) lib/puma/server.rb:437:in `process_client'
puma (3.10.0) lib/puma/server.rb:301:in `block in run'
puma (3.10.0) lib/puma/thread_pool.rb:120:in `block in spawn_thread'

該当のソースコード

marchandise_controller.rb

def new
 # binding.pry
 @marchandise = Marchandise.new
end  

試したこと

このバイトはUTF-8では無効なシーケンスだぜ。と言われているのは理解できていますが、どれがかはわかりませんでした。

元々この部分を担当していたのはProductという名前でしたが、なにがよくないのか分からないのでMarchandiseに変更して一から打ち直しています

このエラーではbetter_errorの画面にならないのでbetter_errorsをコメントアウトして再試行すると
We're sorry, but something went wrong.
If you are the application owner check the logs for more information.(Herokuでおなじみの画面)といわれ、このアクション内で別のモデルをnewしたところ、正常にnewされているのでこのコントローラー自体が変ということではなさそうでした

ただし、他のコントローラーでMarchandiseをnewすると同様のエラーが起きるのでmarchandiseの中身が変なのかなと思います

marchandiseのmigrateはこちら

class CreateMarchandises < ActiveRecord::Migration[5.1]
  def change
    create_table :marchandises do |t|
      t.references  :staff_member,  foreign_key: true
      t.references  :belt,          foreign_key: true
      t.references  :coat,          foreign_key: true
      t.references  :cuff_link,     foreign_key: true
      t.references  :ear_muffler,   foreign_key: true
      t.references  :gant,          foreign_key: true
      t.references  :hat,           foreign_key: true
      t.references  :jacket,        foreign_key: true
      t.references  :knit,          foreign_key: true
      t.references  :lapel_pin,     foreign_key: true
      t.references  :muffler,       foreign_key: true
      t.references  :other,         foreign_key: true
      t.references  :pant,          foreign_key: true
      t.references  :pocket_chief,  foreign_key: true
      t.references  :shoe,          foreign_key: true
      t.references  :shurt,         foreign_key: true
      t.references  :sock,          foreign_key: true
      t.references  :tie_neck,      foreign_key: true
      t.references  :tie_pin,       foreign_key: true
      t.references  :vest,          foreign_key: true
      t.string      :product_face
      t.string      :code
      t.integer     :scene
      t.integer     :season
      t.text        :description
      t.integer     :price

      t.timestamps
    end
  end
end

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

Ruby 2.4.1
Rails 5.1.4
postgreSQL 9.6.3

echo $LANG
ja_JP.UTF-8

よろしくお願いいたします

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • maisumakun

    2017/11/23 07:21

    当該のコントローラーファイルをバイナリダンプで確認してみてください。なにか変なデータが入っていたりはしないでしょうか。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2017/11/23 14:01

    ありがとうございます。確認してみたところ、とくに変わった様子はありませんでした。

    キャンセル

回答 1

0

文字コードにあまりきちんと配慮していない better_errors の欠陥ですが,エラーが起こったときにそのエラーメッセージの文字列を何かしようとして,better_errors 自身が例外を吐くことがあります。(UTF-8 じゃないのに UTF-8 と決め打ちしている)
このケースもそれかもしれません。

We're sorry, but something went wrong. が出たのであれば,その次に書かれているとおり,ログファイルをまず見るといいと思います。
log/development.log か log/production.log

投稿 2017/11/28 19:40

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

ただいまの回答率

91.35%

関連した質問

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

  • Ruby on Rails

    5066questions

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