Есть два разных способа, как вы можете справиться с этим с минимальными изменениями.
find_by!
Первый - убедиться, что возникает исключение, когда пользователь не найден.Вы использовали find_by
, для которого документация гласит:
Если запись не найдена, возвращается nil
.
ДляВ Rails много методов поиска, есть варианты с !
в конце.!
указывает в контексте Rails, что метод вызовет исключение.Для find_by
существует такой же вариант find_by!
.Документация для этого метода говорит вам, что он точно такой же, как find_by
, за исключением того, что он не вернет nil
, но вызовет исключение.
Замените find_by
в decode_user
с find_by!
, и ваш метод должен работать должным образом.
Избегать исключений
Повышение исключений часто рассматривается как антишаблон.Для этого есть много разных причин, но часто используется один аргумент: исключения являются медленными .Если вы посмотрите на код, сгенерированный Rails при использовании скаффолдинга, то увидите, что действия контроллера обычно выглядят так:
def create
@test = Test.new(test_params)
if @test.save
redirect_to @test, notice: 'Test was successfully created.'
else
render :new
end
end
Вы можете использовать тот же шаблон для вашего метода.Сначала расшифруйте пользователя.Затем проверьте, существует ли пользователь, например, с помощью user.present?
.Исходя из этого, либо верните успех или неудачу.
Вы увидите этот паттерн в Rails очень часто, и я бы порекомендовал реорганизовать ваш код, чтобы следовать ему и здесь ...