0

AJAXと検索は初めてです。私はこれで1インチ離れているように感じますが、何を修正すればよいかわかりません。また、私のコントローラーは今私には本当にハッキーに見えます。

とにかく、私はユーザーがAJAXを使用して自分のページのブログ投稿を検索できる検索を作成しようとしています。パーツ(の関連パーツ)は次のとおりです。

posts_controller.rb

def show
  @posts = Post.all.reverse
  @post = Post.find(params[:id])
  @link_num = 10

  respond_to do |format|
    format.html # show.html.erb
    format.json { redirect_to @post }
  end
end

def search
  @link_num = 10
  @posts = Post.all.reverse
  @post = Post.find(params[:id])

  #The including function returns the search results
  @search = Post.first.including(params[:term])
  render 'show'
end

ここで「ハッキー」と思われるのは、すべての変数の割り当てを繰り返すことです(関連性がないために表示しなかったものもあります)。理想的には、AJAX呼び出しでこれらすべての変数を再定義/再ロードする必要はありませんか?また、隠しフィールドを介して検索アクションに:idを渡す必要があります。これは私には奇妙/間違っていると感じます。

show.html.erb

<h1 class="squeeze">Recent Posts</h1>
  <%= form_tag("/search", method: "get", class: "search") do %>
        <%= text_field_tag(:term, '', placeholder: "Search posts:") %>
        <%= hidden_field_tag(:id, @post.id) %>
        <%= submit_tag("Search", class: "btn search_button", remote: true) %>
    <% end %>
  <% if !@search%>
    <ul>
        <% @posts.first(@link_num).each do |p| %>
            <li><a href=<%= p.id %> ><%= p.name %> <span class="manual_small">(<%= p.created_at.strftime("%b %d, %Y") %>)</span></a></li>
        <% end %>
        <% if @posts.length > @link_num %>
            <div class="link_disclaimer">
            <h4>---</h4>
            <h5><%= "Only showing #{@link_num} most recent posts." %></h5>
            <h5>Search to narrow results.</h5>
        </div>
        <% end %>
    </ul>
  <% elsif @search.empty? %>
    <h3>Term not found!</h3>
  <% else %>
    <ul>
        <% @search.first(@link_num).each do |p| %>
            <li><a href=<%= p.id %> ><%= p.name %> <span class="manual_small">(<%= p.created_at.strftime("%b %d, %Y") %>)</span></a></li>
        <% end %>
        <% if @search.length > @link_num %>
            <div class="link_disclaimer">
                <h4>---</h4>
                <h5><%= "Only showing first #{@link_num} relevant hits." %></h5>
                <h5>Narrow search for more specific results.</h5>
            </div>
        <% end %>
    </ul>
  <% end %>

ルート.rb

match '/search', to: 'posts#search'

現在、検索自体は正常に機能しますが、次の3つの大きな問題があります。

  1. 私のコントローラーの前述の混乱。
  2. ページ全体がリロードされるという事実。それはAJAXが行うことになっていることの反対ではありませんか?リンクのリストだけをリロードするにはどうすればよいですか?
  3. URL。非常に面倒です(つまり、 "/ search?utf8 =✓&amp; term = Limits&id = 11&commit = Search")。理想的には検索の影響を受けないようにしておきたいのですが、それが不可能な場合は、「/ search?=」のようなものかもしれません。どうですか?
4

1 に答える 1

2

ここでのコメントに基づいて、関数を機能させるための基本的なロジックがあります(時間がかかりすぎるため、実際のコードはありません)

  1. コントローラでは、「検索」というメソッドを作成します。このメソッドには、検索するフレーズである引数が必要です。dbから結果を取得し、その結果のみでJSONに応答します。

  2. テンプレートには検索フォームがあります。

  3. JSでは、ユーザーが送信ボタンをクリックするイベントをリッスンし、ユーザーが書いた文字をキャッチして、それをajax関数に処理します。

  4. jQueryのajax()を使用して推奨されるAjaxコードを記述します。基本的にajax()を使用して、型指定された文字を引数として#1のコントローラーメソッドに送信します。次に、ajax()はサーバーから応答(検索結果)を取得します。

  5. DOMで結果を更新します。新しいdivを追加して検索結果を表示するか、現在のメインコンテンツのdivを置き換えて結果を表示することができます。

于 2013-02-21T04:16:58.150 に答える