【ruby】openメソッドで画像を開いた時にno implicit conversion of nil into Stringエラーが発生する。
- 評価
- クリップ 0
- VIEW 3,400
発生している問題
下記のプログラムを動かした時にno implicit conversion of nil into String
というエラーが表示されるケースがあって困っています。
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する場合は何か他に特別な処理が必要なのでしょうか?
追加情報
②エラー発生時にターミナルに表示される履歴
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ページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
その場しのぎ感が漂うけど
@image = open(@env + "/uploads/article_body/part_image/"+ @image_id.to_s + "/" + @edit_body["part_image"])
if @image.is_a? StringIO
require 'tempfile'
tmp = Tempfile.new('file')
tmp.binmode
tmp << @image.read
tmp.rewind
@image.close
@image = tmp
end
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
@edit_body["part_image"]
がnil
なんでしょう。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/12/04 09:51
2017/12/04 10:25
2017/12/04 11:05