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

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

ただいまの
回答率

91.37%

  • Ruby

    5170questions

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

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

解決済

回答 2

投稿 2017/12/02 16:32 ・編集 2017/12/02 17:35

  • 評価
  • クリップ 0
  • VIEW 61

gogoackman3

score 81

発生している問題

下記のプログラムを動かした時に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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

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

投稿 2017/12/02 18:11

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/04 09:51

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

    キャンセル

  • 2017/12/04 10:25

    open-uriの仕様ですね

    キャンセル

  • 2017/12/04 11:05

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

    キャンセル

0

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

投稿 2017/12/02 17:05

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/02 17:09

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

    キャンセル

  • 2017/12/02 17:22

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

    キャンセル

  • 2017/12/02 17:32

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

    キャンセル

  • 2017/12/03 00:37

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

    キャンセル

  • 2017/12/04 09:50

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

    キャンセル

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

ただいまの回答率

91.37%

関連した質問

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

  • Ruby

    5170questions

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

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