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

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

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

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

Q&A

1回答

944閲覧

[Rails]ActionDispatch::Http::UploadedFileオブジェクトにreadメソッドを使うと、incompatible character encodings: ASCII

s_diff

総合スコア107

Ruby on Rails

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

0グッド

0クリップ

投稿2019/02/15 08:32

form_for内で、ActionDispatch::Http::UploadedFileオブジェクトに対してreadメソッドを使うと

incompatible character encodings: ASCII-8BIT and UTF-8

というエラーメッセージが起こります。

ruby

1 2# _form.html.erb 3 4<%= form_for([:manage,@product], url: { action: "create_sorted"}, html: { multipart: true }) do |f| %> 5 <div class="file-upload-area"> 6 <div class="sort-box-container sortable"> 7 <% (@products_images).each do |img| %> 8 <div class="sort-box"> 9 <input type="text" class="form-control" readonly="" /> 10 <div style='border: dashed 1px #ccc;'> 11 <%= hidden_field_tag 'products_images[]', value: img, class: 'uploadFile', style: 'width: 90px; font-size: 16px;' %> 12 <div class="imagePreview item" style='padding: 0; background-image: <%= img.read %>'></div> 13 </div> 14 </div> 15 <% end %> 16 </div> 17 </div> 18 <%= f.hidden_field :area_id, value: @product.area_id %> 19 <%= f.hidden_field :building_name, value: @product.building_name %> 20 <%= f.hidden_field :number, value: @product.number %> 21<% end %>

readメソッドを使っているActionDispatch::Http::UploadedFileオブジェクトは、上から9行目、imgです。

<div class="imagePreview item" style='padding: 0; background-image: <%= img.read %>'></div> の部分ですが、 引っかかっているのは上記コードの下から3行目、 <%= f.hidden_field :building_name, value: @product.building_name %> のところです。

UTF-8 の view に対して、ASCII-8BIT の文字列を結合しようとしているのがエラーの原因らしいですが、imgに対してreadメソッドを使ってASCII-8BITに変換されているということなのですが、
ActionDispatch::Http::UploadedFileオブジェクトをバイナリに変える際にUTF-8にする方法がわかりません。なにか方法があるでしょうか?

なにかご教示いただけることがあれば何卒よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

img.readの結果はファイルの中身なのでhtmlにそのまま貼り付ける事はできません。
Data URIを用いる事ができますが
オススメできるかというと微妙ですね

readAsDataURLを用いてアップロード前にプレビューするのがいいと思いますよ

投稿2019/02/15 18:33

asm

総合スコア15147

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

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

s_diff

2019/02/16 02:28

ご回答ありがとうございます。 https://qiita.com/zaru/items/8c0ab5c70775644d4d41 上記の記事を参考にreadAsDataURLを使って実装しようとしたのですが、httpリクエストをPOSTで送るサーバーがわからず画像が登録されません。 この記事の見出し「並び替え」下にあるjsコード34行目 request.open("POST", "./upload.php"); と、55行目 request.open("POST", "./upload-reorder.php"); の部分でサーバーを指定しているようなのですが、どのパスを指定すれば良いのでしょうか?
asm

2019/02/16 03:06

どのパスをと言われても好きなパスを指定すりゃいいのではないでしょうか? controller#actionからurlが欲しいのならばurl_forを用いればよいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問