permanente Cookies und die Votinghistory 0

Posted by fwoeck
on Tuesday, September 16

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