Показать результаты поиска Ransack на другой странице

Я использую Ransack, чтобы добавить простую форму поиска на мою домашнюю страницу. Я хотел бы, чтобы результаты поиска отображались на другой странице, а не на главной странице.

HomeController имеет действие index с переменной @search, установленной следующим образом

def index
   @search = User.search(params[:q])
   @users  = @search.result 
end

Представление содержит

<%= search_form_for @search do |f| %>
  <fieldset>
    <legend>User</legend>
    <ul>
      <li>
        <%= f.label :first_name_or_last_name_cont %>
        <%= f.text_field :first_name_or_last_name_cont %>
      </li>
      <li>
        <%= f.label :email_cont %>
        <%= f.text_field :email_cont %>
      </li>
    </ul>
  </fieldset>

  <fieldset>
    <legend>User's Posts</legend>
    <ul>
      <li>
        <%= f.label :posts_title_cont %>
        <%= f.text_field :posts_title_cont %>
      </li>
    </ul>
  </fieldset>

  <%= f.submit %>
<% end %>

<%= render 'results' %>

Как мне настроить контроллер, чтобы я мог использовать <%= render 'results' %> в другом представлении для другого действия, скажем, для действия search? Как я могу сделать так, чтобы при отправке формы поиска меня перенаправляли на новую страницу для действия search, которое отображает результаты поиска?


person revazsurg    schedule 09.01.2015    source источник


Ответы (1)


Отличный вопрос! Чтобы ответить на ваш вопрос, вы можете создать частный метод с redirect_to другой страницей (которая имеет ‹%=render 'results' %>), если параметры поиска передаются в ваш HomeController.

class HomeController < ApplicationController

before_action :search

def index
   @search = User.search(params[:q])
   @users  = @search.result 
end

private
    def search
      if params[:q]
        search_params = CGI::escapeHTML(params[:q]) 
        redirect_to (url --> see below how to get the url)
      end
    end  
end

Однако, если вы хотите приступить к созданию своего приложения, вы хотите, чтобы результаты поиска отображались на этой специальной странице, независимо от того, где вы находитесь в приложении. Я вставляю полный ответ из небольшого приложения rails. Код немного отличается (form_tag вместо search_form_for), но я знаю, что он работает, так что, надеюсь, он вам поможет.

Ниже приведена часть панели навигации, которая отображается в приложении, а затем соответствующий код для домашней страницы и действия индекса ListingController. Если переданы параметры поиска, то index.html.erb отображает частичный @listings (_listing.html.erb) и ничего ниже тега ‹% else %> на главной странице.

_navigation.html.erb

  <%= form_tag search_path, :method => :get do %>
    <div class="form-group">
      <%= text_field_tag :search, params[:search], class: "form-control", placeholder: "Search" %>
    </div>
      <%= submit_tag "Submit", :name => nil, :class => "btn btn-primary" %>
  <% end %>

index.html.erb

<% if params[:search] %>
  <h2>Search Results</h2>
    <%= render @listings %>
  <% else %>
    ...what usually shows up on my home page with no search results.  
<% end %>

listings_controller

def index
  @listings = Listing.search(params[:search])
end

маршруты.rb

get 'search' => "listings#search"

Это прекрасно работает. Однако, если я нахожусь в другом представлении/контроллере, например, в том, который показывает все категории, и пытаюсь выполнить поиск, то он в основном ищет текущую страницу. Итак, я добавил в контроллер категорий следующее:

Categories_controller

before_action :search
......
private
def search
  if params[:search]
    search_params = CGI::escapeHTML(params[:search]) 
    redirect_to ("/listings?utf8=%E2%9C%93&search=#{search_params}")
  end
end  

НО, для вашего конкретного приложения, чтобы поиск перенаправлялся на домашнюю страницу и отображались результаты поиска, сначала выполните поиск на своей домашней странице и посмотрите, что генерируется в URL-адресе. Допустим, я набрал «сыр» (/listings?utf8=%E2%9C%93&search=сыр). Обратите внимание на %E2%9C%93... вы можете не видеть это, потому что это обычно отображается как проверка в URL-адресе вашего браузера (http://unicode-search.net/unicode-namesearch.pl?term=mark)...so просто вставьте его в текстовый обработчик или текстовая область stackoverflow, чтобы получить «полный URL-адрес», как указано выше. Затем в конце URL-адреса просто замените то, что вы ввели в поле поиска, на #{search_params}.

Это передает все, что было введено в поле поиска, на вашу специальную страницу результатов поиска (в моем случае index.html.erb)!

Вот некоторая документация по CGI escapeHTML (из соображений безопасности): http://ruby-doc.org/stdlib-2.0/libdoc/cgi/rdoc/CGI.html#method-c-escapeHTML

person snewcomer    schedule 10.01.2015