#ruby-on-rails #ruby-on-rails-3
#ruby-on-rails #ruby-on-rails-3
Вопрос:
У меня есть очень простое действие индекса, которое принимает параметр поиска. И это работает…
def index
if params[:search]
@reports = Report.where("title LIKE ?", "%#{params[:search]}%")
else
@reports = Report.all
end
end
Но он показывает ВСЕ записи, когда нет параметра поиска…где я бы хотел, чтобы он отображал none. Попытался установить @reports = nil
, но это выдало ошибку.
Как правильно это сделать?
Обновление: добавление сообщения об ошибке для каждого запроса:
You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each
Extracted source (around line #16):
13: <th>File Type</th>
14: <th>Title</th>
15: </tr>
16: <% for report in @reports %>
17: <tr>
18: <td><%= report.serial %></td>
19: <td><%= report.file_kind %></td>
Ответ №1:
Если вы хотите @reports
быть массивом, вы могли бы сделать :
@reports = params[:search].present?? Report.where("title LIKE ?", "%#{params[:search]}%").all : []
Если вы хотите быть сверхумным, но не суперэффективным в работе с БД, это дает вам @reports
в качестве ActiveRelation
@reports = Report.where(params[:search].present?? ["title like ?", "%#{params[:search]}%"] : "id < 0")
Но на самом деле, контроллер здесь не является нарушающей частью. Когда @reports
есть nil
, откуда берется ошибка? Скорее всего, вам следует сделать
def index
@reports = Report.where("title LIKE ?", "%#{params[:search]}%") if params[:search].present?
end
а затем убедитесь, что остальная часть вашего действия может корректно обрабатывать nil @reports
.
Ответ №2:
Нет ничего плохого в том, чтобы установить переменной @reports значение nil . Я подозреваю, что ошибка выдается либо из after filter, либо из самого представления, где у вас, вероятно, есть какой-то код, который не ожидает, что @reports будет равен нулю. Какую ошибку вы получаете?
Комментарии:
1. думаю, я понял это… заменено
Report.all
на[]
2. Да, итак, проблема в вашем представлении, которое ожидает, что @reports будет массивом. Одним из быстрых решений является установка @results в пустой массив в вашем контроллере, если параметр не передан, т. Е. @results = []
Ответ №3:
Предложение Джесси правильное. Но на вашей странице просмотра все еще отображается ошибка. Итак, вы просто добавляете условие if в конце для раздела end.
... <% end if @reports != nil %>