Получение ошибки при создании страницы поиска

#ruby-on-rails

Вопрос:

Я пытаюсь создать страницу поиска, которая выполняет поиск по модельным курсам. Курсы имеют столбец «название», в котором перечислены названия курсов. Я создал контроллер поиска, и это то, что у меня есть в моем контроллере поиска:

 class SearchController < ApplicationController
def search  
    if params[:search].blank?  
      redirect_to(root_path, alert: "Empty field!") and return  
    else  
      @parameter = params[:search].downcase  
      @results = Courses.all.where("lower(name) LIKE :search", search: @parameter)  
    end  
  end
   def show 
 render 'search'
end
end
 

У меня в разделе просмотры/поиск есть страница search.html.erb. На этой странице у меня есть

 <%= form_tag(search_path, :method => "get",   
class: 'navbar-form navbar-left') do %>  
<div class="input-group">  
<%= search_field_tag :search, params[:search], placeholder: "Search", class: "form-control" %>  
<div class="input-group-btn">  
  <%= button_tag "", :class => 'btn btn-info glyphicon glyphicon-search',:name => nil%>  
 </div>  
 </div>  
 <% end %>

<h3>Search Result</h3>  

<% @results.each do |result| %>  
    <%= result.name %><br>  
<% end %>
 

Однако я получаю следующую ошибку, когда запускаю свой сервер rails и нажимаю на поиск, и я не уверен, почему @results равен нулю. Спасибо за помощь!

 11: <h3>Search Result</h3>  
12: 
13:     <% @results.each do |result| %>  
14:         <%= result.name %><br>  
15:     <% end %>
 

Комментарии:

1. Вам нужно объявить @results в случае params[:search].blank? , если это правда. В настоящее время возвращается ошибка nometoderror, потому что доступ к необъявленной переменной экземпляра возвращает только ноль, а нулевые экземпляры не реализуются each .

Ответ №1:

При app/views/search/search.html.erb отправке указанной формы запрос show по умолчанию отправляется в действие. Но show действие просто отображает представление поиска, не @results назначается, и возникает ошибка.

search Действие кажется ненужным, и вы должны использовать show его вместо этого. Например, переименуйте app/views/search/search.html.erb код в app/views/search/show.html.erb и переместите search его в show действие, как показано ниже:

приложение/контроллеры/search_controller.rb

 class SearchController < ApplicationController
  def show 
    if params[:search].blank?  
      redirect_to(root_path, alert: "Empty field!")  
    else  
      @parameter = params[:search].downcase  
      @results = Courses.all.where("lower(name) LIKE :search", search: @parameter)  
    end
  end
end