不使用整数作为id时生成URL?

时间:2010-04-02 19:57:53

标签: ruby-on-rails

所以我正在建立一个博客引擎,它有/ articles / then-the-article-permalink作为它的URL结构。我需要有prev和next链接,这些链接将跳转到pub_date的下一篇文章,我的代码如下所示:

在我的文章#show

@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])

在我的show.html.erb

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

在我的文章模型中,我有这个:

def to_param
    self.permalink
end

我得到的具体错误信息是:

article_url failed to generate from {:action=>"show", :controller=>"articles", :id=>nil}, expected: {:action=>"show", :controller=>"articles"}, diff: {:id=>nil}

没有上一个和下一个一切都工作正常,但我没有想到为什么这不起作用。有人想帮忙吗?

4 个答案:

答案 0 :(得分:1)

解决了我自己的问题,因为我只有2条记录,总是找到一条零记录。我将视图中的代码更改为:

<%= link_to "Next", article_path(@next_article) if !@next_article.nil? %>
<%= link_to 'Prev', article_path(@prev_article) if !@prev_article.nil? %>

愚蠢和夸大其词的问题,但我想我会为将来会遇到这种情况的人添加解决方案。

答案 1 :(得分:0)

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

应该是这样的:

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

(我将@next_picture更改为@next_article)

答案 2 :(得分:0)

坚持模板中的<% debugger %>,然后检查@next_article.permalink的值是多少?我怀疑固定链接是空白的(空字符串或空字符串)。

另外,总的来说,我是否可以推荐friendly_id作为解决此问题的更强大的解决方案(包括更改永久链接和其他功能)。

答案 3 :(得分:0)

您可以使用will_paginate解决此问题,并将每页的文章数设置为1,并使用named_scope按pub_date排序文章。然后您的下一个和上一个链接将正常工作。 next和previous的URL将显示页码而不是日期,但您可以修改发送到操作的params的行为以使用日期而不是页码。