2012-07-18 1 views
4

J'ai réussi à trouver une solution de contournement à cela maintenant. L'action d'index a maintenant une clause "order" avant l'appel à la page et les repas sont ensuite triés et groupés par date. Le bit hackey suivant: @total_pages et @pages sont utilisés dans la vue pour fournir des liens de pagination car l'aide intégrée pour cela ne fonctionne pas avec le hachage de tableaux retourné par @meals. Ca marche (genre de) mais c'est hackey. Déplacer le truc de vue dans une aide aiderait certainement à le nettoyer, ce qui est ma prochaine étape.Comment paginer un hachage de tableaux à l'aide de la gemme Kaminari (ou will_paginate)

def index 
    @meals = Meal.order('date DESC').page(params[:page]).text_search(params[:query]).sort_by(&:date).reverse.group_by(&:date) 
    @total_pages = (Meal.all.size/7.to_f).ceil 
    @pages = ([email protected]_pages).to_a 
respond_to do |format| 
    format.html # index.html.erb 
    format.json { render json: @meals } 
end 

fin

je vraiment besoin d'aide sur ce point - il a été me rend fou pendant quelques jours. J'essaie de paginer un hachage de tableaux. J'ai essayé à la fois will_paginate et Kaminari, mais je n'arrive pas à trouver un moyen de paginer le hash résultant.

Je cours Rails 3.2.6, Ruby 1.9.3 et PostgreSQL 9.1.3 fait la recherche ...

Dans mon contrôleur (et en utilisant Kaminari) J'ai:

def index 
    @meals = Meal.text_search(params[:query]).sort_by(&:date).reverse.group_by(&:date).page(params[:page]) 
respond_to do |format| 
    format.html # index.html.erb 
    format.json { render json: @meals } 
    end 
end 

Et dans mon modèle, j'ai la recherche suivante:

def self.text_search(query) 
    if query.present? 
    where("description @@ :q or meal_time @@ :q", q: query) 
    else 
    scoped 
    end 
end 

Et dans mon modèle de vue:

<div class="container"> 
    <div class="row"> 
<%= form_tag meals_path, method: :get, :class => "well form-search" do %> 
    <%= text_field_tag :query, params[:query], 
        :class => "span3" %> 
    <%= submit_tag "Search", name: nil, :class => "btn" %> 
    <% if current_user %> 
     <p class="pull-right"> 
    <%= link_to "Add a meal", 
       new_meal_path, 
       :class => 'btn btn-success' %> 
    </p> 
    <% else %> 
    <% end %> 
<% end %>  
</div> 
<table class="table table-striped"> 
<tbody> 
    <% @meals.each do |date, meals| %> 
    <tr> 
    <td> 
     <h2><%= date.to_s(:day_of_month) %></h2> 
     <h6><%= date.to_s(:date_and_month) %></h6> 
     <p><span class="badge badge-warning"><%= pluralize(meals.size, "meal") %></span></p> 
    </td> 
    <% meals.each do |meal| %> 
     <td> 
     <p> 
      <strong> 
      <%= meal.consumed_at.to_s(:just_the_time)%> 
      <%= meal.meal_time %> &#8212; 
      <%= meal.description %> 
      </strong> 
     </p> 
     <%= link_to "Ingredients", meal_path(meal) %> 
     </td> 
     <% end %> 
    </tr> 
    <% end %> 
</tbody> 
</table> 
</div> 
<%= paginate @meals %> 

Cela renvoie l'erreur suivante:

NoMethodError in MealsController#index 

undefined method `page' for Hash 

Toute aide serait accueillie avec reconnaissance!

+0

Je ne sais rien à propos de Ruby, mais ne paginez-vous pas habituellement dans la fonction de recherche, pas après? Je veux dire que vous obtiendriez TOUS les résultats, puis pagineriez dans le hash! Dans la partie text_search ... Ne devrait-il pas y avoir des commandes "skip" et "limit"? – sinni800

+0

@ sinni800 - merci pour l'aide. J'ai réussi à trouver un moyen de contourner ce problème pour le moment! – user792649

+0

Pourriez-vous poster le travail? –

Répondre

2
Kaminari.paginate_array(ARRAY_OBJECT).page(params[:page]).per(50) 
0

Ceci est ma solution après un certain temps des recherches autour si vous devez utiliser will_paginate (Kaminari est plus souple et plus facile à utiliser)

current_page = params[:page] || 1 
    per_page = params[:per_page] || 20 
    length = @data.length 

    @data = WillPaginate::Collection.create(current_page, per_page, length) do |pager| 
    pager.replace @data[pager.offset, pager.per_page].to_a 
    end 

Après avoir exécuté ces codes, @data sera le même que un objet ActiveRecord avec paging will_paginate:

  • @data est un tableau de hachage

  • <% = will_paginate (@data)%> est le code pour afficher le menu de recherche de personnes en vue

espère que cette aide d'autres qui ont la même question.