2

ユーザーが既存のエントリを複製していないことを確認するために、データ入力の前に検索を実装しています。検索結果の数を取得して使用し、ユーザーを次のステップに誘導する方法を特定するのに問題があります。

rails3とpg_searchgemを使用しています

models / 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

-編集を開始します(ジェシーの回答による)

requests_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' %>

-編集を終了

たとえば、検索後またはリンクを介して、他のページからインデックスページにアクセスする方法は2つあります。ユーザーが検索後にインデックスに到達した場合、検索結果の前に次のようなテキストを挿入したいと思います。検索で「x」個のアイテムが生成されました。探しているものが見つからない場合は、ボタンをクリックして新しいリクエストを入力してください。

それ以外の場合、ユーザーがインデックスにリンクしたばかりの場合は、テキストを非表示にして、インデックスをそのまま表示できるようにします。

どういうわけかrequest_searchを介して検索属性にアクセスできると思いますが(何度か試行した後)、ビューに実装する方法がわかりません。

次に、追加できる場合は、ユーザーが新しいエントリを作成することを決定した場合に、検索テキストを入力フィールドの1つにコピーすることを検討しています...

私が質問を明確に述べたかどうか、そしてあなたが私のためにいくつかの光を当てることができるかどうか私に知らせてください。前もって感謝します。

4

1 に答える 1

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」は参照されていない変数になるため、上記のコードの実行に問題が発生します。

于 2012-06-12T14:12:23.033 に答える