1

データベースからランダムな記事をユーザーに表示する「ランダムページ」リンクを実装しようとしています。私は 2 つの別々の (しかし同様の) アプローチを試しました。どちらの方法でも、URL "/random" を ArticleController の "random" メソッドにルーティングします。最初は次のとおりです。

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

これはランダムな記事を提供する場合には機能しますが、2 つの問題があります。まず、URL が正しい記事に更新されないため、ユーザーはリンクをコピーしたり、記事をブックマークしたりできません。次に、以前に閲覧したランダムな記事はブラウザの戻るボタンの履歴に表示されません (つまり、[戻る] を押すと、ユーザーは最初に [ランダム] をクリックする前のページに戻ります)。

2番目のアプローチは次のように置き換えrenderられredirect_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

Chris のコメントを少し拡張すると、次のリンクのランダム ID を生成するリンクをビュー内に作成することができます (これを行う何らかの理由がある場合は... それはあなた次第です)。

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

これをどこにでもドロップでき、クリックするとランダムなページにルーティングされます。:idもちろん、実際のを反映するように数値を変更する必要があります

于 2016-08-15T03:32:19.267 に答える
0

私も似たようなことをしたいと思っていて、困っていました。これが私が思いついた解決策です:

コントローラーでは、 new page は必要ありません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 %>
于 2013-10-07T15:43:54.667 に答える
0

うーん、どうでしょうか

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