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に追加する、というコードです。
コンテンツが存在すれば正常に処理され画面が表示されますが、コンテンツがないままだとエラーが発生する状態です
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の場合は右辺が代入され、それ以外の場合は代入はされません。