Несколько дней спустя я сам нашел оптимальное решение. Я должен был изменить мою модель. Вместо того, чтобы возвращать find (: all) в else, я возвратил новый «пустой» объект поиска
@search=Model.column_name_like("")
Для справки моя модель и контроллер, который теперь поддерживает сортировку, поиск и разбивку на страницы, выглядит так ...
def self.search(search)
if search
Model.column_name_like(search)
else
@search=Model.column_name_like("")
end
end
def index
@per_page = params[:per_page] || Lease.per_page || 20
@search=Lease.search(params[:search])
@objects=@search.find(:all, :order=>(sort_column + " "+ sort_direction)).paginate(:per_page => @per_page, :page => params[:page])
end
private
def sort_column
Model.column_names.include?(params[:sort]) ? params[:sort] : "default_column_name"
end
def sort_direction
%w[asc desc].include?(params[:direction]) ? params[:direction] : "asc"
end
Не забудьте разместить в своем представлении скрытые помощники для передачи имени и направления столбца.
<p>
<% form_tag leases_path, :method => 'get' do %>
<p>
<%= text_field_tag :search, params[:search] %>
<%= submit_tag "Search", :name => nil %>
</p>
<%=hidden_field_tag :direction, params[:direction]%>
<%=hidden_field_tag :sort, params[:sort]%>
<% end %>