2012-06-12 2 views
2

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

Я использую рельсы 3 и pg_search камень

модели/request.rb

class Request < ActiveRecord::Base 
    attr_accessible :description, :title, :user_id, :who 

    belongs_to :user 
    has_many :comments 

    include PgSearch 
    pg_search_scope :search, against: [:title, :description, :who], 
    using: {tsearch: {dictionary: "english"}}, 
     associated_against: {user: :name}, 
     ignoring: :accents 

    def self.request_search(query) 
    if query.present? 
     search(query) 
     where("title @@ :q or description @@ :q or who @@ :q", q: query) 
    else 
     scoped 
    end 
    end 
end 

requests_controller.rb

def index 
    @requests = Request.request_search(params[:search]).order(sort_column + " " + sort_direction).paginate(:per_page => 4, :page => params[:page]) 
    @users = User.all 
    end 

- начать редактирование (в ответ, Джесси)

request_controller.rb (продолжение)

private 

    def sort_column 
    Request.column_names.include?(params[:sort]) ? params[:sort] : "title" 
    end 

    def sort_direction 
    %w[asc desc].include?(params[:direction]) ? params[:direction] : "asc" 
    end 

application_helper.rb

def sortable(column, title = nil) 
    title ||= column.titleize 
    css_class = column == sort_column ? "current #{sort_direction}" : nil 
    direction = column == sort_column && sort_direction == "asc" ? "desc" : "asc" 
    link_to title, params.merge(:sort => column, :direction => direction, :page => nil), {:class => css_class} 
    end 

_requests.html.erb (частичные)

<%= hidden_field_tag :direction, params[:direction] %> 
<%= hidden_field_tag :sort, params[:sort] %> 

<div class="row"> 
    <table class="table table-striped pretty"> 
     <thead> 
      <tr> 
      <th><%= sortable "title" %></th> 
      <th><%= sortable "who", "Requested Pro" %></th> 
      <th><%= sortable "created_at", "When" %></th> 
      <th><%= sortable "request.user", "Requested by" %></th> 
      </tr> 
     </thead> 
     <tbody> 
     <% @requests.each do |request| %> 
     <tr> 
      <td><%= request.title %></td> 
      <td><%= request.who %></td> 
      <td><%= request.created_at %></td> 
      <td><%= request.user.name %></td> 
      <td><%= link_to 'Show', request, :class => 'btn btn-mini'%></td> 
      <% if can? :update, @course %> 
      <td><%= link_to 'Edit', edit_request_path(request) %></td> 
       <td><%= link_to 'Destroy', request, 
          confirm: 'Are you sure?', 
          method: :delete, 
          :class => 'btn btn-mini' %></td> 
      <% end %> 
     </tr> 
     <% end %> 
     </tbody> 
    </table> 
    <div class="pull-right"><%= will_paginate @requests %></div>  
</div> 
<%= button_to 'New Request', new_request_path, :class => 'btn btn-large btn-primary mleft20 mtop20' %> 

- конец редактировать

Например, существует два способа, чтобы прибыть на страницу индекса с других страниц, после поиска или по ссылке. Если пользователь приходит к индексу после поиска, я хотел бы вставить текст перед результатами поиска в представление, которое гласит: в вашем поиске появились элементы «x». Если вы не видите, что ищете, введите новый запрос, нажав на кнопку.

Иначе, если пользователь просто связан с индексом, я хочу, чтобы у меня был возможность скрыть текст и просто показать индекс как есть.

Я думаю, что могу получить доступ к атрибутам поиска (если это правильно их назвать) через request_search, но я не уверен, как реализовать его в представлении (после нескольких попыток).

Во-вторых, если я могу добавить, я ищу, чтобы скопировать текст для поиска в одно из полей ввода, если пользователь решит создать новую запись ...

Пожалуйста, дайте мне знать, если я заявил вопрос (ы) ясно, и если вы можете пролить некоторый свет для меня. Заранее спасибо.

ответ

1
def index 
    @requests = Request.request_search(params[:search]).order(sort_column + " " + sort_direction).paginate(:per_page => 4, :page => params[:page]) 
    @users = User.all 
    @search = params[:search] 
end 

на ваш взгляд:

<% if @search.present? %> 
    <p>Your search yielded <%= pluralize(@requests.total_entries, "item") %>. If you don't see what you're looking for, enter a new request by clicking on the button.</p> 
<% end %> 

<%= form_tag, url: "/" do %> 
    <%= label_tag :search, "Search for:"%> 
    <%= text_field_tag :search, value: @search %> 
    <%= submit_tag "Search" %> 
<% end %> 

Конечная нота: Похоже, вы должны быть опущены код, который получает "sort_column". Кроме того, у вас будет проблема с запуском вышеуказанного кода, так как «sort_column» будет переменной unreferenced.

+0

(Предполагаю, вы используете will_paginate здесь для разбивки на страницы) –

+0

Эй, Джесси. Спасибо за быстрый ответ. Отредактировал вопрос, чтобы включить соответствующие методы сортировки и will_paginate в представлении по вашему предложению. –

+0

Ваш ответ отлично работает, когда пользователь приходит на страницу через поиск (и этого достаточно, чтобы довести меня до конца). Все еще выясняется, что происходит, когда пользователь приходит по ссылке. Прямо сейчас ваше решение возвращает нулевые элементы при достижении по ссылке, потому что нет параметров поиска, т. Е. Никакого поиска. Довольно уверен, что я смогу обработать второй случай, выполнив маршрутизацию на другую целевую страницу и используя те же частичные. Будет опубликован после того, как я смогу это выработать.Еще раз спасибо. –