0

Как можно реорганизовать этот бит кода Ruby on Rails?Условие рефакторинга с диапазоном значений

def select_plan 
     unless params[:plan] && (params[:plan] == '1' || params[:plan] == '2' || params[:plan] == '3' || params[:plan] == '4' || params[:plan] == '5' || params[:plan] == '6' || params[:plan] == '7' || params[:plan] == '8') 
      flash[:notice] = "Please select a membership plan to register." 
      redirect_to root_url 
     end 
    end 
+0

Откуда берутся действительные номера плана? Они происходят из базы данных? Есть ли константа, которая их где-то определяет? Являются ли они магическими числами, посыпанными по всему коду? –

+0

Я прошу, потому что наличие факта «6 является действительным планом», сидящего только в методе контроллера или в нескольких разных местах, это то, что вам нужно для рефакторинга, а не громоздкая реализация, которую вы используете в 'select_plan'. Исправьте основную проблему, и 'select_plan' очистится как побочный эффект. –

+0

@muistooshort - Извините, мой уровень опыта. Действительные номера плана присутствуют в базе данных. Меня интересует то, что вы можете сказать. Я не совсем уверен в этом. –

ответ

0

Если номера плана находятся в базе данных, и есть Plan модель, то вы могли бы просто сказать что-то вроде:

@plan = Plan.find_by(:id => params[:plan]) 
if([email protected]) 
    flash[:notice] = "Please select a membership plan to register." 
    redirect_to root_url 
end 

сейчас у вас есть доступ к полной информации о плане для следующего представления, чтобы вы могли показать им имя, описание, цену и ..., а существование плана хранится только в одном месте (т.е. в базе данных). Если вам не нужно @plan, то вы могли бы сказать:

if(!Plan.where(:id => params[:plan]).exists?) 
    ... 
end 

Важным моментом является то, что должно быть ровно одна вещь, которая знает, что действительные планы и в любое время вы должны знать о планах, вы спросите, что одно и только одно.

мнение, что в конечном итоге вызова select_plan также использовать базу данных (вместо буквенных чисел от одного до восьми), чтобы получить действительные планы:

<% Plan.order(...).each do |p| %> 
    whatever you need to display the plan as an option... 
<% end %> 

Добавить новый план в базу данных и все еще работает , Удалите/отключите план и все еще работает. Ваше программное обеспечение будет легче поддерживать, иметь меньше ошибок, быть более понятным, и вы приобретете новую хорошую привычку, а не плохую.

+1

Я ценю, что вы нашли время, чтобы объяснить и предоставить примеры правильного RoR. Я реализовал первое решение. –

3

Я бы сделал что-то вроде этого.

def select_plan 
    unless params[:plan].in?('1'..'8') 
    flash[:notice] = "Please select a membership plan to register." 
    redirect_to root_url 
    end 
end 

Или как му слишком коротка предложил: сделать Plan реальная вещь. Это может быть модель базы данных или просто маленький рубин Класс:

# in app/models/plan.rb 
require 'set' 
class Plan 
    VALID_PLANS = Set.new('1'..'8').freeze 

    def self.valid_plan?(plan) 
    VALID_PLANS.include?(plan) 
    end 
end 

# used like 
def select_plan 
    unless Plan.valid_plan?(params[:plan]) 
    flash[:notice] = "Please select a membership plan to register." 
    redirect_to root_url 
    end 
end 
+0

Думаю, вам здесь не хватает реальной проблемы. «Как переписать этот оператор' if' »является поверхностной проблемой, реальной проблемой является« откуда я знаю, является ли «params [: plan]» действительным планом ». –

+0

@muistooshort, я не понимаю. Мне кажется, это и то, и другое. –

+0

@CarySwoveland: Предположительно, «план» является фундаментальной частью приложения, поэтому наличие доступных номеров плана в виде пары магических чисел в методе контроллера поражает меня как очень плохую идею. Должна быть какая-то модель «Plan», которая знает, каковы действительные номера плана, тогда контроллер просто спросит «Plan», если 'params [: plan]' был действителен, и 'Plan', вероятно, будет обращаться к базе данных. Код в виде изолированного фрагмента хорош, но он плохо пахнет в контексте приложения в целом. –

Смежные вопросы