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