diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index 3528d1a..1ee2a48 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -11,8 +11,7 @@ class HomeController < ApplicationController before_filter :find_user_from_rss_token, :only => [ :index, :newest ] def index - @stories = find_stories_for_user_and_tag_and_newest_and_by_user(@user, - nil, false, nil) + @stories = find_stories @rss_link ||= " true }) @heading = @title = "Newest Stories" @cur_url = "/newest" + @newest = true @rss_link = "" - @newest = true - respond_to do |format| format.html { render :action => "index" } format.rss { @@ -61,24 +58,23 @@ class HomeController < ApplicationController end def newest_by_user - for_user = User.where(:username => params[:user]).first! + by_user = User.where(:username => params[:user]).first! - @stories = find_stories_for_user_and_tag_and_newest_and_by_user(@user, - nil, false, for_user.id) + @stories = find_stories({ :by_user => by_user }) - @heading = @title = "Newest Stories by #{for_user.username}" - @cur_url = "/newest/#{for_user.username}" + @heading = @title = "Newest Stories by #{by_user.username}" + @cur_url = "/newest/#{by_user.username}" @newest = true - @for_user = for_user.username + @for_user = by_user.username render :action => "index" end def tagged @tag = Tag.where(:tag => params[:tag]).first! - @stories = find_stories_for_user_and_tag_and_newest_and_by_user(@user, - @tag, false, nil) + + @stories = find_stories({ :tag => @tag }) @heading = @title = @tag.description.blank?? @tag.tag : @tag.description @cur_url = tag_url(@tag.tag) @@ -115,8 +111,7 @@ class HomeController < ApplicationController end private - def find_stories_for_user_and_tag_and_newest_and_by_user(user, tag = nil, - newest = false, by_user = nil) + def find_stories(how = {}) @page = 1 if params[:page].to_i > 0 @page = params[:page].to_i @@ -124,32 +119,28 @@ private # guest views have caching, but don't bother for logged-in users or dev or # when the user has tag filters - if Rails.env == "development" || user || tags_filtered_by_cookie.any? - stories, @show_more = - _find_stories_for_user_and_tag_and_newest_and_by_user(user, tag, - newest, by_user) + if Rails.env == "development" || @user || tags_filtered_by_cookie.any? + stories, @show_more = _find_stories(how) else - stories, @show_more = Rails.cache.fetch("stories tag:" << - "#{tag ? tag.tag : ""} new:#{newest} page:#{@page.to_i} by:#{by_user}", - :expires_in => 45) do - _find_stories_for_user_and_tag_and_newest_and_by_user(user, tag, - newest, by_user) + stories, @show_more = Rails.cache.fetch("stories " << + "tag:#{how[:tag].try(:tag)} new:#{how[:newest]} page:#{@page.to_i} " << + "by:#{how[:by_user].try(:id)}", :expires_in => 45) do + _find_stories(how) end end stories end - def _find_stories_for_user_and_tag_and_newest_and_by_user(user, tag = nil, - newest = false, by_user = nil) + def _find_stories(how) stories = Story.where(:is_expired => false) - if user && !(newest || by_user) + if @user && !(how[:newest] || how[:by_user]) # exclude downvoted items stories = stories.where( Story.arel_table[:id].not_in( Vote.arel_table.where( - Vote.arel_table[:user_id].eq(user.id) + Vote.arel_table[:user_id].eq(@user.id) ).where( Vote.arel_table[:vote].lt(0) ).where( @@ -162,13 +153,13 @@ private end filtered_tag_ids = [] - if user + if @user filtered_tag_ids = @user.tag_filters.map{|tf| tf.tag_id } else filtered_tag_ids = tags_filtered_by_cookie.map{|t| t.id } end - if tag + if how[:tag] stories = stories.where( Story.arel_table[:id].in( Tagging.arel_table.where( @@ -178,8 +169,8 @@ private ) ) ) - elsif by_user - stories = stories.where(:user_id => by_user) + elsif how[:by_user] + stories = stories.where(:user_id => how[:by_user].id) elsif filtered_tag_ids.any? stories = stories.where( Story.arel_table[:id].not_in( @@ -192,7 +183,7 @@ private ) end - if newest && @page == 1 + if how[:newest] && @page == 1 # try to help recently-submitted stories that didn't gain traction # grab the list of stories from the past n days, shifting out popular @@ -224,7 +215,7 @@ private ).offset( (@page - 1) * STORIES_PER_PAGE ).order( - newest ? "stories.created_at DESC" : "hotness" + how[:newest] ? "stories.created_at DESC" : "hotness" ).to_a show_more = false @@ -233,9 +224,8 @@ private stories.pop end - if user - votes = Vote.votes_by_user_for_stories_hash(user.id, - stories.map{|s| s.id }) + if @user + votes = Vote.votes_by_user_for_stories_hash(@user.id, stories.map(&:id)) stories.each do |s| if votes[s.id]