Ryota400’s blog

エンジニアを目指して書いてます。

TypeError - no implicit conversion of nil into String

エラー内容

記事投稿アプリの中で、記事の中身(文章)を記入せずに空のままプレビュー画面を見ようとしたらエラーが出ました。

TypeError - no implicit conversion of nil into String

エラー内容
nilからStringへの暗黙の変換がない。
string型に変換する必要がありそうです。 TypeErrorとは メソッドの引数に期待される型ではないオブジェクトや、期待される振る舞いを持たないオブジェクトが渡された時に発生します。

該当箇所確認

article.rb

def build_body(controller)
    result = ''

    article_blocks.each do |article_block|
      result << if article_block.sentence?
                  sentence = article_block.blockable
                  sentence.body 
                elsif article_block.medium?
                  medium = ActiveDecorator::Decorator.instance.decorate(article_block.blockable)
                  controller.render_to_string("shared/_media_#{medium.media_type}", locals: { medium: medium }, layout: false)
                elsif article_block.embed?
                  embed = ActiveDecorator::Decorator.instance.decorate(article_block.blockable)
                  controller.render_to_string("shared/_embed_#{embed.embed_type}", locals: { embed: embed }, layout: false)
                end
    end

    result
  end

簡単に言うとコンテンツがあれば<<でresultに追加する、というコードです。
コンテンツが存在すれば正常に処理され画面が表示されますが、コンテンツがないままだとエラーが発生する状態です

Image from Gyazo

sentence.body.classでsentence.bodyがnil型だと分かりました。
これをstring型にできれば解決すると思われる。

def build_body(controller)
    result = ''

    article_blocks.each do |article_block|
      result << if article_block.sentence?
                  sentence = article_block.blockable
                  sentence.body ||= ''#今回はここを変える!
                elsif article_block.medium?
                  medium = ActiveDecorator::Decorator.instance.decorate(article_block.blockable)
                  controller.render_to_string("shared/_media_#{medium.media_type}", locals: { medium: medium }, layout: false)
                elsif article_block.embed?
                  embed = ActiveDecorator::Decorator.instance.decorate(article_block.blockable)
                  controller.render_to_string("shared/_embed_#{embed.embed_type}", locals: { embed: embed }, layout: false)
                end
    end

    result
  end

元々、sentence.bodyだけだとnill型なので sentence.body ||= ''のようにする。

||= ''とは

||=は自己代入やnilガードと呼ばれるものです。
左辺がnilまたはfalseの場合は右辺が代入され、それ以外の場合は代入はされません。