0

index.html.erbユーザーが以前にそのコントローラーに関連付けられたレコードを表示したかどうかに基づいて、コントローラーのページの内容を変更したいと考えています。

私の特定のケースでは、Item モデル、Items コントローラー、および Items ビューがあります。アイテムのビューindex.html.erbには、各アイテムへのリンクが表示されます。アイテムが以前に表示された場合、そのリンクindex.html.erbがイタリック体になるように、このビューをセットアップする必要があります。表示されていない場合、リンクは太字になります。

視覚的には、このアプローチは電子メールの受信箱に似ており、未閲覧のアイテムは件名の見出しが太字で表示され、閲覧済みのアイテムは通常のフォントの太さが表示されます。

私の質問は、この以前のスタック オーバーフローの投稿に似ています。ただし、その投稿はデータベース構造に関連する一般的な回答を提供します。私が見逃しているこの動作を実現するための「Rails の方法」があるかどうか知りたいです。リンクされた投稿が適切である場合、Rails を使用して投稿の推奨ソリューションを実現する方法について提案を提供できますか?

ブラウザーに依存し、適切な CSS を使用して訪問済み URL と未訪問 URL のスタイルを設定することもできますが、私のプロジェクトに関連する他の理由から (実際にはこの質問ではありません)、Rails、フック、および/に依存するソリューションが必要です。またはデータベース。これを行う簡単な Rails の方法がない場合は、他のソリューション (jQuery ベースなど) も検討します。

4

3 に答える 3

2

正直なところ、あなたが言及したリンクのオプション1 、それを行う最も「Railsな方法」のようです。Viewと を持つというモデルを作成しitem_idますuser_idView最も重要なことはリソースを作ることだと思います。

更新:ユーザーがそのアイテムにアクセスした場合、そのアイテムを閲覧済みとしてマークしたいとしましょうItems#show。とても簡単です -- でItems#show、そのページのビューをレンダリングする前に、次のようにします。

View.create(item_id: params[:id], user_id: current_user.id)

current_userログインしていないことなどを心配している場合は、ユーザーをログインさせるためにbefore_filteronを作成するかItems#show(アイテムを表示する前にログインする必要がある場合)、view条件付きで作成することができます。

if current_user
  View.create(item_id: params[:id], user_id: current_user.id)
end
于 2012-07-02T20:00:38.113 に答える
0

インデックスで使用されるテーブルに新しい列を追加し、表示済みと呼びます

ページをレンダリングした後、行の表示列を true または 1 に設定します。

次にページをロードするときに、その列で表示されたかどうかを確認し、イタリック体で表示し、ページをレンダリングして新しい行を設定します。つまり、すべての行を true に設定します。

-- 秘訣は、ページのレンダリング後に行を更新することです --

新しいレコードを挿入するときは、列ビューを false にして挿入します -- 表示されません

于 2012-07-02T20:03:30.203 に答える
0

リンクをセッションごとに変更したい場合は、これを行うことができます...

Railsでこれを行うことに本当に設定されている場合は、変数をセッションに保存して、ページが訪問されたかどうかを確認できます。何かのようなもの

session["visited_hash"]["name_of_page_or_whatever"] = true

その後、インデックスページに

if session["visited_hash"]["name_of_page_or_whatever"] == true
  #render link with special formatting
else
  #render normally

正直なところ、これはおそらく CSS で実装しますが、これは Rails で実装する 1 つの方法です。ただし、それが最も効率的であるという保証はありません。

于 2012-07-02T20:04:20.610 に答える