2014-10-08 4 views
1

Я пытаюсь заставить этот вложенный оператор if работать, но мой синтаксис неверен, и я не могу понять это. У меня есть окно поиска в приложении Rails 4 и раскрывающемся списке сортировки. На странице результатов поиска я хочу сортировать списки товаров на основе того, что пользователь выбирает в раскрывающемся списке сортировки. Если пользователь не вводит поисковый запрос, я хочу, чтобы сообщение отображалось. Вот мой код контроллера.Ruby - синтаксис оператора вложенного IF

Если я удаляю условия и просто показываю сортировку по умолчанию, страница результатов поиска отображается нормально, поэтому ошибка содержится в синтаксисе оператора if.

def search 
    if params[:search].present? 

     if params[:sort] == "- Price - Low to High" 
     @listings = ... 
     elsif params[:sort] == "- Price - High to Low" 
     @listings = ... 
     elsif params[:sort] == "- New Arrivals" 
     @listings = ... 
     elsif params[:sort] == "- Random Shuffle" 
     @listings = ... 
     else 
     @listings = ... 
     end 

    else 
     flash[:notice] = "Please enter one or more search terms e.g. blue shirt." 
    end 

    end 
+1

Каково точное поведение кода? Всегда ли уведомление всегда отображается? – Undo

+0

Слишком много прикованных 'elsif'. Похоже, вы могли бы сильно использовать «переключатель», который существует в Ruby в форме 'case' /' when': http://stackoverflow.com/questions/948135/how-can-i-write-a- switch-statement-in-ruby –

+0

Вы проверяете, что: поиск присутствует, но затем «переключение» на: sort. Правильно ли это поведение? –

ответ

3

То, что вы хотите здесь является case заявления, переключателя от других языков, таких как JavaScript и C:

def search 
    if params[:search].present? 
    @listings = 
     case (params[:sort]) 
     when "- Price - Low to High" 
     ... 
     when "- Price - High to Low" 
     ... 
     when "- New Arrivals" 
     ... 
     when "- Random Shuffle" 
     ... 
     else 
     ... 
     end 
    else 
    flash[:notice] = "Please enter one or more search terms e.g. blue shirt." 
    end 
end 

В Ruby результат case заявления может быть использован для назначения переменная, поэтому исключается много повторений @listings =. То же самое касается if.

То, что вы сравниваете, выглядит необычно. Если у вас есть раскрывающийся список, который используется для выбора порядка сортировки, они должны иметь более сжатые значения, используемые внутри, например plh для представления «Цена - от низкого до высокого» или даже числовых кодов. Это означает, что при изменении фразы ваш код все еще работает.

0

Я бы поменял ваше падение, чтобы иметь значения, такие как price asc, price desc, arrival_date asc (не уверен в случайном перетасовке), то вы могли бы использовать.

def search 
    if params[:search].present? 
    sort_listings(params[:sort]) 
    else 
    flash[:notice] = "Please enter one or more search terms e.g. blue shirt." 
    end 
end 

def sort_listings(sort) 
    @listings ||= ... 
    @listing.order(sort) 
end 
Смежные вопросы