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

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

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

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

解決済

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

gogoackman3
gogoackman3

総合スコア109

Ruby

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

2回答

0評価

0クリップ

4973閲覧

投稿2017/12/02 07:32

編集2017/12/02 08:35

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

ruby

def on @article = Article.find(params[:article_id]) # 準備としてパーツのコピーを生成する。 @bodies = ArticleBody .where(article_id: @article.id) .order(list_num: :ASC) # ボディパーツがない場合は、本番モードに戻す。 if @bodies.blank? flash[:success] = "まだパーツがないので本番モードで記事作成をしてください。" redirect_to controller: 'articles', action: 'edit', id: @article.id return end # トランザクション付きで全てのedit_bodyを複製 EditBody.transaction do @bodies.each do |body| @edit_body = body.attributes # 画像がないパーツの保存 if @edit_body["part_image"].blank? @edit_body.delete("id") EditBody.create!(@edit_body) # 画像が含まれるパーツの保存 else @image_id = @edit_body["id"] if Rails.env.production? @env = "https://○○○.s3.amazonaws.com" else @env = "http://0.0.0.0:3000" end @image = open(@env + "/uploads/article_body/part_image/"+ @image_id.to_s + "/" + @edit_body["part_image"],'rb') @edit_body["part_image"] = @image @edit_body.delete("id") EditBody.create!(@edit_body) @image.close end end end # 例外が発生していない場合の処理(編集モードに切り替えて元の画面に返す) @article.update(edit_mode: true) redirect_to controller: 'articles', action: 'edit', id: @article.id rescue => e # 例外が発生した場合の処理(エラー付きで元の画面に返すだけ) respond_to do |format| format.html { redirect_to(edit_managements_article_path(@article.id) , danger: '編集モードへの移行に失敗しました。お手数ですが、ブラウザを更新した上で再度お試しください。')} # end 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

Started POST "/managements/articles/56/edit_bodies/on" for 10.0.2.2 at 2017-12-02 17:26:48 +0900 Cannot render console from 10.0.2.2! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 Processing by Managements::EditBodiesController#on as HTML Parameters: {"authenticity_token"=>"QTxt99bCtvSt1rQCKRUzcBAu0S0w6HduXbrxhfRD8/tD8ts5j5KiBBFC41CosGMJLvivUH+r9SC9vo//KADKXw==", "article_id"=>"56"} Admin Load (0.4ms) SELECT `admins`.* FROM `admins` WHERE `admins`.`id` = 1 ORDER BY `admins`.`id` ASC LIMIT 1 Article Load (0.2ms) SELECT `articles`.* FROM `articles` WHERE `articles`.`id` = 56 LIMIT 1 ArticleBody Load (0.6ms) SELECT `article_bodies`.* FROM `article_bodies` WHERE `article_bodies`.`article_id` = 56 ORDER BY `article_bodies`.`list_num` ASC Completed 500 Internal Server Error in 36ms (ActiveRecord: 4.8ms) TypeError (no implicit conversion of nil into String): app/controllers/managements/edit_bodies_controller.rb:51:in `block in on' app/controllers/managements/edit_bodies_controller.rb:25:in `on' 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 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 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) 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 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) 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 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) 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)

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Ruby

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