#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