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

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

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

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

Q&A

解決済

2回答

5646閲覧

【ruby】openメソッドで画像を開いた時にno implicit conversion of nil into Stringエラーが発生する。

gogoackman3

総合スコア109

Ruby

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

0グッド

0クリップ

投稿2017/12/02 07:32

編集2017/12/02 08:35

###発生している問題
下記のプログラムを動かした時にno implicit conversion of nil into Stringというエラーが表示されるケースがあって困っています。

ruby

1 def on 2 3 @article = Article.find(params[:article_id]) 4 5 # 準備としてパーツのコピーを生成する。 6 @bodies = ArticleBody 7 .where(article_id: @article.id) 8 .order(list_num: :ASC) 9 10 # ボディパーツがない場合は、本番モードに戻す。 11 if @bodies.blank? 12 flash[:success] = "まだパーツがないので本番モードで記事作成をしてください。" 13 redirect_to controller: 'articles', action: 'edit', id: @article.id 14 return 15 16 end 17 18 # トランザクション付きで全てのedit_bodyを複製 19 20 EditBody.transaction do 21 @bodies.each do |body| 22 @edit_body = body.attributes 23 24 # 画像がないパーツの保存 25 if @edit_body["part_image"].blank? 26 @edit_body.delete("id") 27 EditBody.create!(@edit_body) 28 29 # 画像が含まれるパーツの保存 30 else 31 @image_id = @edit_body["id"] 32 33 if Rails.env.production? 34 @env = "https://○○○.s3.amazonaws.com" 35 else 36 @env = "http://0.0.0.0:3000" 37 end 38 39 @image = open(@env + "/uploads/article_body/part_image/"+ @image_id.to_s + "/" + @edit_body["part_image"],'rb') 40 41 @edit_body["part_image"] = @image 42 @edit_body.delete("id") 43 EditBody.create!(@edit_body) 44 @image.close 45 end 46 end 47 end 48 49 # 例外が発生していない場合の処理(編集モードに切り替えて元の画面に返す) 50 51 @article.update(edit_mode: true) 52 redirect_to controller: 'articles', action: 'edit', id: @article.id 53 54 rescue => e 55 # 例外が発生した場合の処理(エラー付きで元の画面に返すだけ) 56 respond_to do |format| 57 format.html { redirect_to(edit_managements_article_path(@article.id) , danger: '編集モードへの移行に失敗しました。お手数ですが、ブラウザを更新した上で再度お試しください。')} 58 # end 59 end

具体的には@image = open(@env + "/uploads/article_body/part_image/"+ @image_id.to_s + "/" + @edit_body["part_image"])の部分です。

①問題ない時は@imageの中身

Tempfile:/tmp/open-uri20171202-3561-eabc01

②エラーになる時の@imageの中身

<StringIO:0x007f98c57effa8 @base_uri=#<URI::HTTP http://0.0.0.0:3000/uploads/article_body/part_image/850/7d306eb5-b26a-4fdb-a900-377fc0883860.jpg>, @meta={"last-modified"=>"Sat, 02 Dec 2017 06:54:10 GMT", "content-type"=>"image/jpeg", "content-length"=>"10087"}, @metas={"last-modified"=>["Sat, 02 Dec 2017 06:54:10 GMT"], "content-type"=>["image/jpeg"], "content-length"=>["10087"]}, @status=["200", "OK"]>

###なんとなくわかっている事
10kb程度の小さな画像ファイルをopenする場合に発生している模様。どうやら容量が小さいとひらけない?

###やってみた事
こちらの記事を参考に、第二引数に"rb"を追加し@image = open(@env + "/uploads/article_body/part_image/"+ @image_id.to_s + "/" + @edit_body["part_image"],"rb")としてみましたが、結果は同じでした。

惜しいところまで行っている気がするのですが、何がダメなのでしょうか?10kg程度のファイルをopenする場合は何か他に特別な処理が必要なのでしょうか?

###追加情報

①エラー発生画面
イメージ説明

②エラー発生時にターミナルに表示される履歴

ruby

1Started POST "/managements/articles/56/edit_bodies/on" for 10.0.2.2 at 2017-12-02 17:26:48 +0900 2Cannot render console from 10.0.2.2! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 3Processing by Managements::EditBodiesController#on as HTML 4 Parameters: {"authenticity_token"=>"QTxt99bCtvSt1rQCKRUzcBAu0S0w6HduXbrxhfRD8/tD8ts5j5KiBBFC41CosGMJLvivUH+r9SC9vo//KADKXw==", "article_id"=>"56"} 5 Admin Load (0.4ms) SELECT `admins`.* FROM `admins` WHERE `admins`.`id` = 1 ORDER BY `admins`.`id` ASC LIMIT 1 6 Article Load (0.2ms) SELECT `articles`.* FROM `articles` WHERE `articles`.`id` = 56 LIMIT 1 7 ArticleBody Load (0.6ms) SELECT `article_bodies`.* FROM `article_bodies` WHERE `article_bodies`.`article_id` = 56 ORDER BY `article_bodies`.`list_num` ASC 8 9Completed 500 Internal Server Error in 36ms (ActiveRecord: 4.8ms) 10 11 12 13TypeError (no implicit conversion of nil into String): 14 15app/controllers/managements/edit_bodies_controller.rb:51:in `block in on' 16app/controllers/managements/edit_bodies_controller.rb:25:in `on' 17 Rendering /home/vagrant/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/actionpack-5.0.1/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout 18 Rendering /home/vagrant/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/actionpack-5.0.1/lib/action_dispatch/middleware/templates/rescues/_source.html.erb 19 Rendered /home/vagrant/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/actionpack-5.0.1/lib/action_dispatch/middleware/templates/rescues/_source.html.erb (3.6ms) 20 Rendering /home/vagrant/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/actionpack-5.0.1/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb 21 Rendered /home/vagrant/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/actionpack-5.0.1/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (2.1ms) 22 Rendering /home/vagrant/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/actionpack-5.0.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb 23 Rendered /home/vagrant/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/actionpack-5.0.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (1.2ms) 24 Rendered /home/vagrant/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/actionpack-5.0.1/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout (32.6ms)

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

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

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

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

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

guest

回答2

0

ベストアンサー

その場しのぎ感が漂うけど

rb

1@image = open(@env + "/uploads/article_body/part_image/"+ @image_id.to_s + "/" + @edit_body["part_image"]) 2if @image.is_a? StringIO 3 require 'tempfile' 4 tmp = Tempfile.new('file') 5 tmp.binmode 6 tmp << @image.read 7 tmp.rewind 8 @image.close 9 @image = tmp 10end

投稿2017/12/02 09:11

asm

総合スコア15147

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

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

gogoackman3

2017/12/04 00:51

ありがとうございます!こちらで問題なく動作しました。なぜopenした時にtempfileとstringIOに分かれるのか謎ですが・・・。
asm

2017/12/04 01:25

open-uriの仕様ですね
gogoackman3

2017/12/04 02:05

なるほど、ありがとうございます!
guest

0

@edit_body["part_image"]nilなんでしょう。

投稿2017/12/02 08:05

otn

総合スコア84423

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

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

gogoackman3

2017/12/02 08:09

openして@imageに代入するタイミングでしょうか? openするタイミングの@edit_body["part_image"]の中身を表示すると以下のようになります。 "-----------------------" "c73c66f4-eb1e-48b6-b7ff-b3fcf64de2f6.jpg" "-----------------------"
otn

2017/12/02 08:22

エラーメッセージを全部書いてください。
gogoackman3

2017/12/02 08:32

本文に補足としてエラー情報を追加させていただきました。これ以外にエラー情報を取れるでしょうか?(初心者ですみません。
otn

2017/12/02 15:37

openの行でnilになっているということで、最初はopen前のエラーかと思ったのですが、openには成功していそうですね。 ファイルサイズが小さいときに、一時ファイルを作られていないことが原因だとすると、 asmさんの対処でためして見てください。
gogoackman3

2017/12/04 00:50

ありがとうございます。試してみたところ問題なく動作しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問