实现连续侧边栏搜索的最佳Rails方法是什么?

时间:2014-02-25 00:30:16

标签: ruby-on-rails ajax search

我正在尝试制作食谱网站。我希望有一个侧边栏,用户可以一次添加一种成分,主体将刷新并仅显示具有该成分的配方。我认为AJAX在这里很棒。

但是我不确定这些递归搜索最好的Rails方式是什么。我的想法:

  • 使用会话保存搜索词---但我在某处读到会话只是为了保存像ids这样的短字符串数据。
  • 创建新的表资源以保存搜索字词。每次新会话重置表。
  • 重复配方表并仅对当前配方应用新搜索(通过先前搜索的那些)。有点像桌面视图,如果我记得就在我参加数据库课程的时候。

我已经实现了一个简单的搜索,我从params获取搜索词并适当地刷新食谱。我需要在每次新搜索时不断缩小范围,但是现在只需从Recipe.all开始每次搜索。

我不确定这里最好的方法是什么。我希望这是有道理的。

1 个答案:

答案 0 :(得分:0)

<强>的Ajax

您可能正在寻找名为“live search”或“自动填充”的内容

这可以通过输入(从您的搜索框),将其发送到endpoint(如评论中所述)(通过ajax),然后在屏幕上显示结果

“持久性”将是您将数据保留在DOM中,因此您不需要将数据保留在后端,除非您希望在整个页面转换期间保持结果

  

我们在one of our dev sites

上实施了类似的功能

搜索

您可以使用full text lookup,也可以使用sunspot

等第三方搜索

搜索可以像这样处理:

#config/routes.rb
match 'search(/:search)', :to => 'recipes#search', :as => :search, via: [:get, :post]

#app/controllers/recipes_controller.rb
def search
    @recipes = Recipe.search(params[:search])
respond_to do |format|
    format.js   { render :partial => "elements/livesearch", :locals => {:search => @recipes, :query => params[:search]} }
    format.html { render :index }
    end
end

使用textacular gem

#app/models/recipe.rb
def self.search(search)
    basic_search(name: search, description: search).take(5)
end

#app/views/elements/livesearch.html.erb
<%= search.each do |recipe| %>
    #your recipes
<% end %>

<强> JQuery的

以上代码将根据您的输入文本

从数据库中返回项目

你需要将它附加到DOM,这是JQuery的领域:

#app/assets/javascripts/application.js
$(document).on("change", "#search_input", function() {
    $.ajax({
       url: "/search"
       data: $(this).serialize();
       success: function(data) {
           //append to DOM
       }
    });
});