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 方法是用嵌套的 ifelsif 语句编写的,我将其重构为:

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。

谢谢