Понимание Rails: действие индекса — как вернуть none при отсутствии параметра поиска?

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