#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)