2010-04-02 4 views
4

Donc, je construis un moteur de blog qui a/articles/then-the-article-permalink comme c'est la structure de l'URL. Je dois avoir des liens prev et à venir qui sauteront à l'article suivant par pub_date, mon code ressemble à ceci:Générer des URL sans utiliser un entier comme ID?

Dans mes articles # montrent

@article = Article.find_by_permalink(params[:id]) 
@prev_article = Article.find(:first, :conditions => [ "pub_date < ?", @article.pub_date]) 
@next_article = Article.find(:first, :conditions => [ "pub_date > ?", @article.pub_date]) 

Et dans mon show.html.erb

<%= link_to "Next", article_path(@next_article) %> 
<%= link_to 'Prev', article_path(@prev_article) %> 

Dans mon modèle articles que j'ai ceci:

def to_param 
    self.permalink 
end 

Le message d'erreur spécifique que je reçois est:Sans le prev et le next, tout fonctionne correctement, mais je ne comprends pas pourquoi cela ne fonctionne pas. Quelqu'un veut-il aider?

Répondre

1

Résolu mon propre problème, parce que je n'avais que 2 enregistrements, il trouvait toujours un enregistrement nul. J'ai changé le code dans les vues:

<%= link_to "Next", article_path(@next_article) if [email protected]_article.nil? %> 
<%= link_to 'Prev', article_path(@prev_article) if [email protected]_article.nil? %> 

problème stupide et surfaite, mais je pensais que je rajouterais la solution pour tous ceux qui vient à travers ce à l'avenir.

0
@next_picture = Article.find(:first, :conditions => [ "pub_date > ?", @article.pub_date]) 

devrait probablement ceci:

@next_article = Article.find(:first, :conditions => [ "pub_date > ?", @article.pub_date]) 

(j'ai changé @next_picture à @next_article)

+0

Désolé, il y a eu une erreur de copier/coller. C'était en fait @next_article. – Synthesezia

0

bâton dans un <% debugger %> dans votre modèle, puis vérifier ce que la valeur de la @next_article.permalink est? Je suspecte que le permalien soit vide (chaîne vide ou nulle).

Aussi, en général, je peux recommander le friendly_id comme une solution plus robuste à ce problème (y compris changer les permaliens et d'autres caractéristiques).

+0

Donc, j'ai utilisé le débogueur et j'ai trouvé @ next_article.permalink mais ça donne @ next_article.id comme nul, donc il semble qu'il trouve l'objet mais pour une raison quelconque l'objet n'a pas d'identifiant. – Synthesezia

+0

Cela signifie que l'objet n'a pas encore été enregistré dans la base de données. – gtd

+0

Ou avez-vous remplacé la méthode id? – gtd

0

Vous pouvez utiliser will_paginate pour ce problème et définir le nombre d'articles par page à 1, et utiliser un named_scope pour commander les articles par pub_date. Alors vos liens suivant et précédent fonctionneraient simplement. Les URL pour next et previous afficheront le numéro de page plutôt que la date, mais vous pourriez probablement modifier le comportement des paramètres envoyés à l'action pour utiliser la date au lieu du numéro de page.

Questions connexes