応用編3

2021.5.6

 

テキスト挿入時のバグ修正

テキストを入力せずにプレビューを確認すると、no implicit conversion of nil into 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?
 
省略

 

デバッグを追加して確認してみた。

f:id:mmm_st:20210506195705p:plain

 

article_block.blockableは存在するが、sentencesentence.bodynilになっている。

result <<これで代入しようとしているが、resultString型でsentencObject型なので、代入できない。文字の時はいいがnilの時ブランクにしなければならない。

 

nilの時ブランクにするために ||= '' を追加

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?
省略

 

「 || 」自己代入演算子

ex)

a ||= XXX   → aが偽か未定義ならaにxxxを代入する

今回はnilだった時にブランクを追加

参照

Rubyで使われる記号の意味(正規表現の複雑な記号は除く) (Ruby 3.0.0 リファレンスマニュアル)

sentence .body.to_sでもnilの場合に空文字がかえってくるが、空文字を明示的に表示するには↑この方法の方が良い。

 

 

今回のRSec

反省点

❶ spec/factories/articles.rbに記載する内容にsequenceを使用するのを忘れていた。

❷ spec/system/admin_articles_previews_spec.rbの流れも分かりにくい作りにしてしまっていた。

自分→新規作成から流れでテストした

回答例→編集ページから流れでテストしていた。書く内容が少なく、流れもわかりやすかった。

 

spec/factories/articles.rb

sequence を使用して複数件作成してもエラーにならないようにする。

FactoryBot.define do
factory :article do
sequence(:title) { |n| "title-#{n}" }
sequence(:slug) { |n| "slug-#{n}" }
end
end