如何实现与paginate一起使用的简单搜索表单?

时间:2011-09-06 11:21:54

标签: ruby-on-rails search will-paginate railscasts nomethoderror

我关注瑞安贝茨的铁路广播:http://railscasts.com/episodes/37-simple-search-form 用will-paginate在页面上解决搜索结果的问题。

他在这里回答了如何解决这个问题的问题。但是,我尝试过它们并没有任何运气。从他的第二个决议开始,我得到了“search_conditions”的NoMethod错误。

守则:

    projects/index.rhtml 
<% form_tag projects_path, :method => 'get' do %>
  <p>
    <%= text_field_tag :search, params[:search] %>
    <%= submit_tag "Search", :name => nil %>
  </p>
<% end %>

projects_controller.rb 
def index
  @projects = Project.search(params[:search])
end

models/project.rb 
def self.search(search)
  if search
    find(:all, :conditions => ['name LIKE ?', "%#{search}%"])
  else
    find(:all)
  end
end

他的回答:

一种方法是调用类方法“search_conditions”,而不是让它执行查找,它只返回一个条件数组,以便您可以在paginate方法中使用它。

Course.paginate(:all,:conditions =&gt; Course.search_conditions(..))

另一种方法是调用方法“paginated_search”并让它调用“paginate”而不是“find”。

最后,您可以让搜索方法接受使用with_scope设置查找条件的块。通过这种方式,您可以在该块中调用“paginate”,并自动应用条件。

有人可以向我解释我应该如何解决这个问题?我是铁路新手,也许我只是误解了他说的话。

1 个答案:

答案 0 :(得分:3)

Railscast你跟随的是相当古老的,从那以后发生了很多变化。尝试更改search方法的实现,如下所示:

def self.search(search)
  if search
    where 'name LIKE ?', "%#{search}%"
  else
    scoped
  end
end

在控制器中有类似的东西:

def index
  @projects = Project.search(params[:search]).paginate(:page => params[:page])
end