开发者

Generating URLs when not using an integer as an id?

开发者 https://www.devze.com 2022-12-25 18:19 出处:网络
So I\'m building a blog engine which has /articles/then-the-article-permalink as it\'s URL structure. I need to have prev and next links which will jump to the next article by pub_date, my code looks

So I'm building a blog engine which has /articles/then-the-article-permalink as it's URL structure. I need to have prev and next links which will jump to the next article by pub_date, my code looks like this:

In my articles#show

@article = Article.find_by_permalink(params[:id])
@prev_article = Article.find(:first, :conditions => [ "pub_date < ?", @article.pub_date])
@next_article = Article.f开发者_运维百科ind(:first, :conditions => [ "pub_date > ?", @article.pub_date])

And in my show.html.erb

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

In my articles model I have this:

def to_param
    self.permalink
end

The specific error message I get is:

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

Without the prev and next everything is working fine but I'm out of ideas as to why this isn't working. Anyone want to help?


Solved my own problem, because I only had 2 records it was always finding a nil record. I changed the code in the views to:

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

Stupid and overblown problem, but I thought I'd add the solution for anyone that comes across this in future.


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

should probably be this:

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

(I changed @next_picture to @next_article)


Stick in a <% debugger %> in your template and then check what the value of the @next_article.permalink is? I suspect the permalink is blank (either empty string or nil).

Also, just in general, can I recommend the friendly_id as a more robust solution to this problem (including changing permalinks and other features).


You could use will_paginate for this problem and set the number of of articles per page to 1, and use a named_scope to order the articles by pub_date. Then your next and previous links would just work. The URLs for next and previous would show the page number rather than the date, but you could probably modify the behaviour of the params sent to the action to use the date instead of the page number.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号