我正在尝试实现“随机页面”链接,该链接将向用户呈现数据库中的随机文章。我尝试了两种不同的(但相似的)方法,在这两种方法中,我将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重定向感觉有点不对。
在显示文章的正确网址以及维护浏览器历史记录链的同时,提供随机文章的最佳方式是什么?
答案 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 %>