obrazek

Ruby on Rails odkazy na další a předchozí články

19.02.2019 by Martin Andráši

Existuje několik balíčků (gem), které udělají paginaci za mě. Nechci si ale zbytečně instalovat cizí gem pro jednoduchou věc. Odkaz na další a předchozí článek není tak těžké udělat pomocí dotazů.

Zadání:

  • šipka na předchozí a následující článek (jen pokud nějaké jsou)
  • články jen které jsou aktivní (viditelné)

Nejdříve v modelu určím články, které jsou v administraci zvolené jako aktivní tzn :visible. Mohu udělat dotaz přímo pomocí where(:visible => true), ale díky "scope" můžeme .visible funkci přiřazovat libovolně do query dotazu.

scope :visible, -> { where(:visible => true)}

Pak se zeptám dotazem jestli od aktuálního data self.created_at existuje nějaký článek následující a také jestli je nějaký předchozí.

    def next
        self.class.where("created_at > ?", self.created_at).visible.order(created_at: :asc).first
    end

    def prev
         self.class.where("created_at < ?", self.created_at).visible.order(created_at: :desc).first
    end

Výsledek by mohl být nějak takto:

class Post < ApplicationRecord

   scope :visible, -> { where(:visible => true)}

    def next
        self.class.where("created_at > ?", self.created_at).visible.order(created_at: :asc).first
    end

    def prev
         self.class.where("created_at < ?", self.created_at).visible.order(created_at: :desc).first
    end

end

V controlleru nalezneme aktuální článek podle :id

def show

@post = Post.find(params[:id])

end

Ve view pak chci, aby se ukazovali odkazy jen když nějaký článek (další nebo předchozí) bude existovat.

// .slug = "/odkaz-na-clanek" 
<div class="a-pagination">
      <%if !@post.prev.nil?%>
      <a href="<%= post_url(@post.prev.slug) %>">Předchozí článek</a>
      <%end%>

      <%if !@post.next.nil?%>
      <a href="<%= post_url(@post.next.slug) %>">Další článek</a>
      <%end%>
</div>

Komentáře

0 komentářů


Kontakt

Napište mi