How to refactor case statement to avoid Error: undefined method `[]' for nil:NilClass when runnig system test?
How to refactor case statement to avoid Error: undefined method `[]' for nil:NilClass when runnig system test?
我正在 Ruby-on-Rails 学习并做一些学校作业。我需要重构 default_avatar
方法。
我要实现的逻辑是:
首先,检查用户名是否存在,如果不存在,则return默认头像(在本例中为AVATAR_CATLIKE
)。 (一行代码)
否则,select 基于用户名的默认头像。 (这与 case 语句)
最初,default_avatar
方法是用嵌套的 if
和 elsif
语句编写的,我将其重构为:
从 module ApplicationHelper
文件中提取:
def default_avatar(user)
if user.name.present?
user
else
AVATAR_CATLIKE
end
user = case
when user.name[0].downcase < "h" then AVATAR_CATLIKE <- #line:15 highlighted
when user.name[0].downcase < "n" then AVATAR_RHOMBUS
when user.name[0].downcase < "u" then AVATAR_PIRAMID
else AVATAR_CONIC
end
end
这是测试套件:
3 class LogInTest < ApplicationSystemTestCase
4 test 'sign up creates a User' do
5 visit(new_user_path)
6 fill_in('Email', with: 'new_user@gmail.com')
7 fill_in('Password', with: 'password')
8 click_button('Sign up')
9 assert current_path.include?(users_path)
10 end
运行测试时,出现错误:
ActionView::Template::Error: undefined method `[]' for nil:NilClass
app/helpers/application_helper.rb:15:in `default_avatar'
app/views/application/_user_card.html.erb:12:in `_app_views_application__user_card_html_erb___82684501134077429_70123472943620'
app/views/users/show.html.erb:5:in `_app_views_users_show_html_erb__133265224909210904_70123472923260'
bin/rails test test/system/log_in_test.rb:4
关于如何改进我的代码并避免给定错误的任何提示?
在此先感谢您的帮助。
我找到了一个解决方案,但我不确定它是否完全正确:
在module ApplicationHelper
def default_avatar(user)
AVATAR_CATLIKE unless user.name.present?
case
when "#{user.name}".downcase < "h" then AVATAR_CATLIKE
when "#{user.name}".downcase < "n" then AVATAR_RHOMBUS
when "#{user.name}".downcase < "u" then AVATAR_PIRAMID
else AVATAR_CONIC
end
end
这样一切正常。
但如果有人有其他解决方案,欢迎提供 post id。
谢谢
我正在 Ruby-on-Rails 学习并做一些学校作业。我需要重构 default_avatar
方法。
我要实现的逻辑是:
首先,检查用户名是否存在,如果不存在,则return默认头像(在本例中为AVATAR_CATLIKE
)。 (一行代码)
否则,select 基于用户名的默认头像。 (这与 case 语句)
最初,default_avatar
方法是用嵌套的 if
和 elsif
语句编写的,我将其重构为:
从 module ApplicationHelper
文件中提取:
def default_avatar(user)
if user.name.present?
user
else
AVATAR_CATLIKE
end
user = case
when user.name[0].downcase < "h" then AVATAR_CATLIKE <- #line:15 highlighted
when user.name[0].downcase < "n" then AVATAR_RHOMBUS
when user.name[0].downcase < "u" then AVATAR_PIRAMID
else AVATAR_CONIC
end
end
这是测试套件:
3 class LogInTest < ApplicationSystemTestCase
4 test 'sign up creates a User' do
5 visit(new_user_path)
6 fill_in('Email', with: 'new_user@gmail.com')
7 fill_in('Password', with: 'password')
8 click_button('Sign up')
9 assert current_path.include?(users_path)
10 end
运行测试时,出现错误:
ActionView::Template::Error: undefined method `[]' for nil:NilClass
app/helpers/application_helper.rb:15:in `default_avatar'
app/views/application/_user_card.html.erb:12:in `_app_views_application__user_card_html_erb___82684501134077429_70123472943620'
app/views/users/show.html.erb:5:in `_app_views_users_show_html_erb__133265224909210904_70123472923260'
bin/rails test test/system/log_in_test.rb:4
关于如何改进我的代码并避免给定错误的任何提示?
在此先感谢您的帮助。
我找到了一个解决方案,但我不确定它是否完全正确:
在module ApplicationHelper
def default_avatar(user)
AVATAR_CATLIKE unless user.name.present?
case
when "#{user.name}".downcase < "h" then AVATAR_CATLIKE
when "#{user.name}".downcase < "n" then AVATAR_RHOMBUS
when "#{user.name}".downcase < "u" then AVATAR_PIRAMID
else AVATAR_CONIC
end
end
这样一切正常。
但如果有人有其他解决方案,欢迎提供 post id。
谢谢