搜索功能在ruby on rails上不起作用

时间:2013-05-16 09:59:17

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2 erb

我正在为帖子搜索创建表单。我这样做....

erb表单代码......

<%= form_tag '/posts/search-post', :remote=> "true" do %>
 <p>
  <%= text_field_tag :search, params[:search], :placeholder => "Search Posts..." %><br/>
  <%= radio_button_tag :day, 1, params[:day] %>None
  <%= radio_button_tag :day, 2, params[:day] %>Last Week
  <%= radio_button_tag :day, 3, params[:day] %>Last Month<br/>
  <%= submit_tag "Search", :onclick => "document.getElementById('spinner').style.visibility='visible';document.getElementById('postlist').style.visibility='hidden'" %>
 </p>
<% end %>

root.rb

match 'posts/search-post', to: 'posts#search_post'

posts_controller.rb

  def search_post
    if !params[:search].blank? && params[:day].blank?
     @posts = Post.paginate(page: params[:page],:per_page => 5).search(params[:search])
   elsif params[:search].blank? && !params[:day].blank?
     @posts = Post.paginate(page: params[:page],:per_page => 5).all   if params[:day] == "1"
     @posts = Post.paginate(page: params[:page],:per_page => 5).where("created_at >= ?", 1.week.ago.utc)   if params[:day] == "2"
     @posts = Post.paginate(page: params[:page],:per_page => 5).where("created_at >= ?", 1.month.ago.utc)   if params[:day] == "3"
   elsif !params[:search].blank? && !params[:day].blank?
     @posts = Post.paginate(page: params[:page],:per_page => 5).search(params[:search]) if params[:day] == "1"
     @posts = Post.paginate(page: params[:page],:per_page => 5).search(params[:search]).where("created_at >= ?", 1.week.ago.utc)   if params[:day] == "2"
     @posts = Post.paginate(page: params[:page],:per_page => 5).search(params[:search]).where("created_at >= ?", 1.month.ago.utc)   if params[:day] == "3"    
   else
   end 
  end 

Post.rb模型

  def self.search(search)
    search_condition = "%" + search + "%"
    if search
      find(:all, :conditions => ['lower(content) LIKE ? OR lower(title) LIKE ?', search_condition.downcase,search_condition.downcase])
    else
      find(:all)
    end
  end

搜索post.js.erb

$("#posts_list").html("<%= escape_javascript( render(:partial => "posts") ) %>");

当我按关键字和日期类型搜索时,搜索无效(获取所有帖子列表项)。我不知道我哪里错了。请帮忙。

1 个答案:

答案 0 :(得分:0)

我不确定您是否故意这样做,但是在您控制器的elseifelse部分中,您将覆盖搜索结果。

例如,在else部分,您首先执行此操作:

@posts = Post.paginate(page: params[:page],:per_page => 5).search(params[:search]) if params[:day] == "1"

然后你这样做:

@posts = Post.paginate(page: params[:page],:per_page => 5).where("created_at >= ?", 1.week.ago.utc)   if params[:day] == "2"

这意味着@posts中保存的第二组结果将覆盖您的第一组结果(第一行中保存在@posts中的内容)。

因为你正在做“&amp;&amp;”然后,您应该将第一行的结果集包含在第二行中。

您的问题的一个解决方案可能是将Post.rb模型更改为以下内容:

def self.search(search, previous_results_set)
    search_condition = "%" + search + "%"
    if search
      if previous_result_set.nil?
        find(:all, :conditions => ['lower(content) LIKE ? OR lower(title) LIKE ?', search_condition.downcase,search_condition.downcase])
      else
        previous_result_set.find(:all, :conditions => ['lower(content) LIKE ? OR lower(title) LIKE ?', search_condition.downcase,search_condition.downcase])
    else
      find(:all)
    end
  end

我的代码可能不完美,你可能会在代码中找到一种更有效的方法,但你明白了。即使您使用.where,也需要在之前的结果集上执行.where,而不是再次在Post模型上执行{{1}}。这样您就可以过滤先前过滤的结果。

希望这有帮助。