###発生している問題
下記のプログラムを動かした時に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の中身
②エラーになる時の@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)

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/04 00:51
2017/12/04 01:25
2017/12/04 02:05