在保持浏览器历史记录的同时重定向到随机页面

时间:2012-12-12 20:08:10

标签: ruby-on-rails ruby-on-rails-3

我正在尝试实现“随机页面”链接,该链接将向用户呈现数据库中的随机文章。我尝试了两种不同的(但相似的)方法,在这两种方法中,我将URL“/ random”路由到ArticleController中的“random”方法。这是第一个:

def random
  offset = rand(Article.published.size)
  @article = Article.published.offset(offset).first
  render :action => 'show'
end

这适用于提供随机文章,但有两个问题:第一,URL没有更新到正确的文章,因此用户无法复制文章的链接或书签;第二,之前查看的随机文章没有显示在浏览器的后退按钮的历史记录中(即按下“返回”会使用户返回到他们所在的页面,然后再单击“随机”)。

第二种方法用render代替redirect_to

def random
  offset = rand(Article.published.size)
  @article = Article.published.offset(offset).first
  redirect_to @article
end

这解决了第一个问题 - 它是一个重定向,因此浏览器实际上被重定向到随机选择的文章的相应URL(因此它可用于复制/书签)。但是,“后退”按钮的问题仍然存在。此外,为这样的事情选择HTTP重定向感觉有点不对。

在显示文章的正确网址以及维护浏览器历史记录链的同时,提供随机文章的最佳方式是什么?

3 个答案:

答案 0 :(得分:1)

为什么不为随机文章制作实际链接?

助手:

def random_article_link
  random_article = Article.find_by_sql("SELECT 1 FROM articles ORDER BY RANDOM() LIMIT 1") # for MySql RAND()
  link_to "Random Article", random_article  
end

在您的方法中,您无法在控制器级别上快速更改URL字符串。仅在使用约束的路由级别上。

答案 1 :(得分:0)

嗯,

@article = Article.find(rand(Article.count))
redirect_to @article

答案 2 :(得分:0)

我想做类似的事情并且也遇到了麻烦。这是我提出的解决方案:

在您的控制器中,您不需要新页面articles/random。我假设你想要你的文章页面上的链接,这将是你的控制器中的show动作。

def show
   @article = Article.find(params[:id]
   @random_article = Article.order('random()').first
end

然后在您的视图show.html.erb文件

<%= link_to "Random Article", @random_article %>