Как реорганизовать длинную строку в Ruby

Я получил этот фрагмент кода, который увеличивает ограничение длины строки, превышающее нарушение Rubocop:

return organisation_path(current_user.organisation) if current_user.organisation
return session[:previous_url] if session[:previous_url]
return organisation_path(current_user.pending_organisation_id) if current_user.pending_organisation_id
root_path

конец

Предел превышен в предпоследней строке. Я пытаюсь реорганизовать эту строку, чтобы раскрыть преступление Рубокопа.

Моя первая попытка состояла в том, чтобы разделить его следующим образом:

return organisation_path(current_user.pending_organisation_id) if
  current_user.pending_organisation_id

Но это не выглядит читабельно.

Моя вторая попытка состояла в том, чтобы выделить эту строку в метод, поэтому я создал этот метод:

def pending_organization_path_for_current_user
  return organisation_path(current_user.pending_organisation_id) if current_user.pending_organisation_id
end

Но опять же, имя метода слишком длинное и, следовательно, строка

 pending_organization_path_for_current_user if current_user.pending_organisation_id

превышает длину строки, и, следовательно, решение для меня неосуществимо.

Итак, мой вопрос как новичка: как я должен рассматривать такие случаи рефакторинга?


person Lokesh    schedule 22.06.2017    source источник
comment
Как насчет того, чтобы просто разбить оператор if на несколько строк?   -  person Severin    schedule 22.06.2017
comment
Тогда Rubocop вызовет нарушение Guard Clause.   -  person Lokesh    schedule 22.06.2017


Ответы (2)


Как насчет того, чтобы просто разбить оператор if на несколько строк?

if current_user.pending_organisation_id
  return organisation_path(current_user.pending_organisation_id)
end
person Severin    schedule 22.06.2017
comment
Тогда Rubocop вызовет нарушение Guard Clause. - person Lokesh; 22.06.2017
comment
можете ли вы добавить точный код, который вы написали, который вызывает это нарушение? - person Severin; 22.06.2017
comment
Мне жаль. Это не поднимает Охранную оговорку, но я думал, что это произойдет. - person Lokesh; 22.06.2017
comment
Это решение, но я беспокоюсь, что это увеличивает размер метода. Это нормально с точки зрения качества кода? - person Lokesh; 22.06.2017
comment
Проблем с качеством кода не вижу. Это намного более читабельно, чем однострочный текст. - person Severin; 22.06.2017
comment
Окей круто. Большое спасибо. Сначала я думал об этом решении, но поскольку я видел много более ранних примеров, где в таких случаях возникала ошибка предложения Guard, я подумал, что это решение не будет работать. - person Lokesh; 22.06.2017

Я предполагаю, что вы не хотите настраивать параметры Rubocop, чтобы изменить принятый стиль, поэтому вы можете исправить это следующим образом:

if current_user.pending_organisation_id
  organisation_path(current_user.pending_organisation_id)
end

Однако иногда проще просто признать, что это один из тех случаев, когда вы знаете лучше, чем Rubocop, поэтому просто добавьте исключение:

# rubocop:disable Style/WhateverLineLengthIsCalled
return organisation_path(current_user.pending_organisation_id) if current_user.pending_organisation_id
# rubocop:enable Style/WhateverLineLengthIsCalled
person Ginty    schedule 22.06.2017