ユーザーが特定のページをロードするたびに、ランダムなモデルへのリンクを表示したいとします。このリンクを表示するページが ModelController#index アクションであるとします。
ランダム化はページが最初に読み込まれたときにのみ発生するため、コントローラー アクションで行うことができます。
class ModelController < ActionController::Base
#other actions
def index
#any other index code
@random_model = Model.order('random()').first
end
end
ビューで、通常の方法でそのモデルにリンクできます。
<%= link_to("Shuffle", @random_model, :class => "btn btn-small btn-warning") %>
コントローラー アクションが実行されるたびに、モデルがランダムに選択され、ページをレンダリングするときにそのモデルへのリンクが含まれます。
対処するために編集されました:
「コードをインデックスに入れてアクションを表示せずに動作させる方法はありますか?」
はい。実際には、モデルをビュー コードで直接読み込むことができます。通常はコントローラ内のインスタンス変数に代入するのが「より正しい」方法なのですが、ご指摘の通りコードの重複につながります。これを複数のビューに含めたい場合は、パーシャルにすることをお勧めします。そのようなもの:
ビュー/共有/_shuffle.erb:
<%= link_to("Shuffle", Model.order('random()').first, :class => "btn btn-small btn-warning") %>
次に、ランダム化されたリンクを含めたい任意のページでその部分をレンダリングします。
<%= render 'shared/shuffle' %>
ページ内でこのパーシャルを複数回レンダリングする場合、ランダム モデルはリンクごとに異なることに注意してください。