Как реализовать простую форму поиска, которая будет использоваться в сочетании с paginate? - PullRequest
0 голосов
/ 06 сентября 2011

Я слежу за передачами Райана Бейтса: http://railscasts.com/episodes/37-simple-search-form в решении моей проблемы с результатами поиска на странице с will-paginate.

Здесь он отвечает на вопрос, как решить эту проблему. Однако я попробовал их, и мне не повезло. Следуя его второму решению, я получаю ошибку NoMethod для "search_conditions" в результате.

Код:

    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», и вместо того, чтобы его выполнить, find просто вернет массив условий, чтобы вы могли использовать его в методе paginate.

Course.paginate (: все,: условия => Course.search_conditions (..))

Другой способ - вызвать метод «paginated_search» и вызвать его «paginate» вместо «find».

Наконец, вы можете сделать так, чтобы метод поиска принимал блок, который использует with_scope для установки условий поиска. Таким образом, вы можете вызвать «paginate» в этом блоке, и условия будут автоматически применены.

Может кто-нибудь объяснить мне, как я должен решить эту проблему? Я новичок в рельсах и, возможно, я просто неправильно понимаю, что он говорит.

1 Ответ

3 голосов
/ 06 сентября 2011

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
...