応用編1

2021.05.04

 

応用編1

slim

・< >や閉じタグなどを削り、最低限必要なものだけを残した、非常にシンプルなテンプレート言語

・軽量

HTMLがより簡潔に記述できる

 

導入方法

Gemfileにslim-railsを記述bundle install を実行後viewファイルの拡張子をhtml.slimにする。

slim-railsを導入後、ジェネレーター経由で生成されるviewファイルの拡張子はhtml.erbからhtml.slimに変更される

 

slimの記述方

slimはテンプレートエンジンなので、最終的にはHTMLで出力される。

READMEに日本語訳され書いてあるので確認する。

slim/README.jp.md at master · slim-template/slim · GitHub

 

<流れ>

エラー

Nil location provided. Can't build URl.

表示されているのが、

medium = local_assigns[:medium]

.media-image
= image_tag medium.image_url(:lg) #ここでエラーが出ている

 

デバッグを使用して確認する。

表示されているのが、

medium = local_assigns[:medium]

.media-image
- byebug
= image_tag medium.image_url(:lg) #ここでエラーが出ている

 

f:id:mmm_st:20210505220834p:plain

medium.image_url(:lg)

=> nil

ここが原因?

urlがない時にnilになっている。→urlがない時の流れを記述しないと、Nil location provided. Can't build URl.が出てしまう。

 

↓このように、if文でmadium.image_urlがある時にのみにする。

medium = local_assigns[:medium]

- if medium.image_url
.media-image
= image_tag medium.image_url(:lg)

 

RSpec作成

今回作成した部分についてテストを作成していく。

factories/users.rbにFactoryBotのデータを作成する。traitも使用していく。

# admin権限を設定しないこと。default値のroleであるwriterを設定するのが望ましい。
FactoryBot.define do
factory :user do
sequence(:name, "admin-1") #sequenceは常にユニークな値がはいる。
create_listだと常にユニークとは限らない。
password { 'password' }
password_confirmation { 'password' }
role { :writer } #admin権限を設定しないこと。意図せずadmin権限を持った
ユーザーでテストしないように。
default値のroleであるwriterを設定するのが望ましい。

trait :admin do
sequence(:name, "admin-1")
role { :admin }
end

trait :editor do
sequence(:name, "editor-1")
role { :editor }
end

trait :writer do
sequence(:name, "writer-1")
role { :writer}
end
end
end

 

FactoryBot省略、spec/support配下のモジュールを追記する

config.include FactoryBot::Syntax::Methods #FactoryBot省略

config.include LoginMacros #spec/support配下のモジュールを読み込む

 

spec/support配下にloginモジュールを追加する

(spec/suport/login_macros.rb)に記述し、使えるようにする。

module LoginMacros
def login(user)
visit admin_login_identifier_path
fill_in 'user[name]', with: user.name
click_button '次へ'
fill_in 'user[password]', with: 'password'
click_button 'ログイン'
end
end

 

spec_helper.rbにSeedFu.seedを追記する

自動テストは副作用をなくす意味でもDBがクリーンな状態で実行される。テストで挿入されたデータはテスト終了後に削除する(される)のが一般的。しかしマスターデタについては存在することを前提に実行したい。RSpecによる自動テストの場合、実行前に一度SeedFu.seedを実行するように記述する。fixtures以下のファイルを読み込む。

=end
config.before :suite do
SeedFu.seed
end

参照

Railsアプリのマスターデータ管理 Seed Fu ベタープラクティス - ナガモト の blog

 

spec/sysytem配下にファイルを作成して、テストを作成する。

require 'rails_helper'

RSpec.describe 'AdminArticlePreview', type: :system do
let(:admin) { create :user, :admin } #adminのユーザー作成
describe '記事作成画面で画像を追加' do
context '画像を選択せずにプレビューを確認' do
it '正常に表示される' do
login(admin) #↑で作成したユーザーでログイン
click_link '記事'
visit admin_articles_path
click_link '新規作成'
fill_in 'タイトル', with: 'テスト'
fill_in 'スラッグ', with: 'test'
click_button '登録する'
click_link 'ブロックを追加する'
click_link '画像'
click_link 'プレビュー'
switch_to_window(windows.last) #タブが新しく作成される
expect(page).not_to have_content("Nil location provided. Can't build URI"),
'エラーページが表示されています' #回答見て追記。これも記述したほうがよかった。
expect(page).to have_content 'テスト'
end
end
end
end