1

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

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

这适用于提供随机文章,但有两个问题:首先,URL 没有更新到正确的文章,因此用户无法复制链接或为文章添加书签;其次,之前浏览过的随机文章不会显示在浏览器的后退按钮的历史记录中(即按“后退”将用户带回到他们第一次单击“随机”之前所在的页面)。

第二种方法替换renderredirect_to

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

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

提供随机文章,同时显示文章的正确 URL 并维护浏览器历史链的最佳方式是什么?

4

4 回答 4

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 字符串。仅在使用约束的路由级别。

于 2012-12-12T20:47:21.140 回答
0

嗯怎么样

@article = Article.find(rand(Article.count))
redirect_to @article
于 2012-12-12T20:40:34.197 回答
0

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

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

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

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

<%= link_to "Random Article", @random_article %>
于 2013-10-07T15:43:54.667 回答
0

稍微扩展一下 Chris 的评论 - 可以在视图中创建一个链接,该链接将为下一个链接生成一个随机 id(如果你有一些理由这样做......这取决于你)。

<%= link_to 'Show me a random thing', thing_path(rand(1..4)) %>

您可以将其放置在任何地方,单击时它会简单地路由到一个随机页面。当然,您需要更改数字以反映实际:id

于 2016-08-15T03:32:19.267 回答