Problem: Ein User soll aus einer Liste von Artikeln immer nur die neuesten drei angezeigt bekommen, die er noch nicht bewertet hat. Die User-Id soll in einem Domain-Cookie abgelegt werden.
Rahmenbedigungen: Ein Modell Ideas speichert die Artikel, ein Modell Votes speichert einzelne Berwertungsvorgänge und den voter (die User-Id):
class Idea < ActiveRecord::Base
has_many :votes, :dependent => :destroy
named_scope :not_yet_done, :conditions => '(realized IS NULL) or (realized = "")'
named_scope :already_done, :conditions => '(realized IS NOT NULL) and (realized <> "")'
named_scope :top3, :limit => 3
end
class Vote < ActiveRecord::Base
belongs_to :idea
end
Der IdeasController prüft, ob ein Anmelde-Cookie vorliegt:
class IdeasController < ApplicationController
before_filter :userid, :only => [ :new_ideas, :most_popular, :realized, :by_tag ]
def userid
if cookies[:userid].blank?
redirect_to logins_url
else
@userid = cookies[:userid]
end
end
def new_ideas
ideas = Idea.not_yet_done.all(:order => 'created_at DESC')
@ideas = ideas.select {|i| ! i.votes.map(&:voter).include?(@userid)}[0..2]
@idea = Idea.new(:owner => @userid)
@vote = Vote.new
render :action => 'summary'
end
...
Die @ideas = …-Zeile wählt nur die Artikel aus, deren voter-Attribute nicht die aktuelle User-Id @userid enthalten.
Der LoginsController legt das Cookie an und löscht es wieder:
class LoginsController < ApplicationController
def index
end
def create
cookies[:userid] = { :value => params[:userid], :expires => 10.years.from_now }
redirect_to new_ideas_ideas_url
end
def new
cookies.delete :userid
redirect_to new_ideas_ideas_url
end
end