Page 116 of 164

Paginacja (pagination) z pomocą Kaminari a paginacja tablic (Array)

Korzystając z 254 Railscasta dot. paginacji z pomocą Kaminari, natknąłem się na problem paginacji tablic. Dawniej korzystałem z WillPagination i tworzyłem sobie instancję tego obiektu, wrzucając co mi tam trzeba. Paginowało ładnie. Niestety czasy się zmieniają i przyszło mi korzystać z Kaminari (które nawiasem mówiąc jest dużo wygodniejsze). Kaminari dodaje tylko scope'y - tak więc z definicji nie obsługuje niczego innego niż ActiveRecord.

Aby obejść ten problem, przygotowałem małe rozszerzenie klasy Array. Z racji tego, że paranoją byłoby ładować do tablicy wszystko (załóżmy że danych jest duuuużo), rozszerzenie to, działa na już "skróconym" (czy też zpaginowanym) zbiorze. Przykład:

Mamy 100 linijek tekstu, chcemy wyświetlać po 10 i skorzystać z paginacji. Wybieramy więc interesującą nas stronę:

@pagin_lines = @lines[20, 10]
@total_lines = @lines.count
@total_lines.paginable(3, 10, @total_lines)

I tyle. Parametry są następujące:

  1. page - na której stronie jesteśmy (którą stronę wyświetlamy),
  2. per_page - ile elementów na stronie,
  3. total_elements_amount - ile jest łącznie elementów.

I to by było na tyle. Cały kod też nie jest skomplikowany:

# Rozszerzenie klasy Array umożliwiające korzystanie z paginacji za pomocą
# pluginu Kaminaro
class Array
  def paginable(page, per_page, total_elements_amount)
    @paginate_page = page
    @paginate_per_page = per_page
    @paginate_total_elements_amount = total_elements_amount
    self.instance_eval <<-EVAL
      def current_page
        @paginate_page.to_i
      end

      def num_pages
        (@paginate_total_elements_amount/@paginate_per_page).floor.to_i
      end

      def limit_value
        @paginate_per_page.to_i
      end

    EVAL
  end
end

Od teraz możemy normalnie wykorzystywać tablicę@total_lines do paginacji:

<%= paginate @total_lines %>

Rails3, rails.js i document.on is not a function

Pracując dzisiaj nad Senpuu v5 - zauważyłem że Susanoo (autorski CMS pod Senpuu) nie pokazuje JSowych confirmów. Przykładowo coś takiego:

link_to "Usuń notkę", :confirm=>"Czy jesteś pewien?", :method=>"delete"

nie działało. JS ładował się prawidłowo, jednak po włączeniu Firebuga, natknąłem się na taki oto błąd:

document.on is not a function

A po kliknięciu, zamiast wysyłać żądanie usunięcia, realizowane było normalne "linkowe".

Firebug dokładnie wskazywał na tę metodę:

document.on("click", "a[data-method]", function(event, element) {
  if (event.stopped) return;
    handleMethod(element);
    event.stop();
  });

Okazało się, że Rails3 korzysta z nowego Prototype 1.7 - a ja przez przypadek wkleiłem stare. Komunikat zniknął po przywróceniu nowej wersji Prototype. Wziąć ją można z internetu lub generując sobie nowy projekt:

rails new givemeprototype

i kopiując odpowiednie pliki z /public/javascripts/.

Copyright © 2024 Closer to Code

Theme by Anders NorenUp ↑