Параметры в операторе «where» выдают ошибку «отсутствует конец»

#ruby-on-rails #if-statement #controller #syntax-error

#ruby-on-rails #if-statement #контроллер #синтаксическая ошибка

Вопрос:

Я не уверен, что я делаю неправильно. Я пытаюсь включить операторы if в функцию редактирования в контроллере. Я продолжаю получать сообщение об ошибке, в котором говорится, что я пропускаю оператор end, хотя я знаю, что это не так. Интересно, должен ли я выполнять оператор «do» перед ifs? Я не уверен, как это будет работать.

 class FiltersController < ApplicationController

(.. other stuff ..) 

def edit
    @filter = Filter.first
    @project = Project.all
    
    if (@filter.date_to =! nil) amp;amp; (@filter.date_from =! nil)
        if (@filter.project =! nil)
            @hourlogs = Hourlog.where([project_id: @filter.project], ["date >= ?" date_from], ["date <= ?" date_to])
        elsif (@filter.project == nil)
            @hourlogs = Hourlog.where(["date >= ?" date_from, "date <= ?" date_to])
        end
    elsif (@filter.project == nil)
        @hourlogs = Hourlog.all
    else 
        @hourlogs = Hourlog.all
    end
end

(.. more stuff ..) 

end
  

У меня есть инструкции end для класса, для функции редактирования, для первого «если» и для второго «если».

Это ошибка, которую я получаю:

 /vagrant/src/hourly/app/controllers/filters_controller.rb:26: syntax error, unexpected tIDENTIFIER, expecting ']' ...roject], ["date >= ?" date_from], ["date <= ?" date_to]).ord... ... ^~~~~~~~~ /vagrant/src/hourly/app/controllers/filters_controller.rb:26: syntax error, unexpected tIDENTIFIER, expecting ']' ...ate_from], ["date <= ?" date_to]).order(date: :desc).paginat... ... ^~~~~~~ /vagrant/src/hourly/app/controllers/filters_controller.rb:28: syntax error, unexpected tIDENTIFIER, expecting ']' ...og.where(["date >= ?" date_from, "date <= ?" date_to]).order... ... ^~~~~~~~~ /vagrant/src/hourly/app/controllers/filters_controller.rb:28: syntax error, unexpected tIDENTIFIER, expecting amp;. or :: or '[' or '.' ... date_from, "date <= ?" date_to]).order(date: :desc).paginat... ... ^~~~~~~ 
  

И вот его фотография:
сообщение об ошибке для операторов end

Я раньше не включал операторы if в свой контроллер, поэтому я не уверен, что я делаю неправильно. Основываясь на статьях, которые я читал в Интернете, это правильный синтаксис. Пожалуйста, помогите.

РЕДАКТИРОВАТЬ: похоже, что проблема вызвана множеством требований в предложении where, в частности, <= и >= date . Но я все еще застрял.

 @hourlogs = Hourlog.where([project_id: @filter.project], ["date >= ?" date_from], ["date <= ?" date_to])
  

Любой ввод с точки зрения того, как должен быть структурирован оператор where?

Ответ №1:

В Ruby используется nil? при проверке, равен ли объект нулю. При использовании Rails present? и blank? при тестировании пользовательского ввода, поскольку они также будут отклонять пустые строки.

 def edit
  @filter = Filter.first
  @project = Project.all
  @hourlogs = Hourlog.all
  if @filter.project.present?
    @hourlogs = @hourlogs.where(project_id: @filter.project)
  end
  if @filter.date_to.present? amp;amp; @filter.date_from.present?
    @hourlogs = @hourlogs.where(date: @filter.date_to..@filter.date_from)
  end
end
  

В Ruby not equals оператор есть != . Использование unless обычно предпочтительнее, и вы не сравниваете значения с nil или true / false, как на языках более низкого уровня. Вместо этого используйте методы предикатов для самого объекта — Ruby — полностью объектно-ориентированный язык.

И поскольку .where это аддитивно, вы можете просто начать с базовой области и добавить дополнительные условия в предложение where, переназначив переменную.

Ответ №2:

=! Должно быть != .

where Часть должна быть примерно такой.

 @hourlogs = Hourlog
            .where(project_id: @filter.project.id)
            .where(date: date_from...date_to)