search_controller.rb
2.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
class SearchController < ApplicationController
helper TagsHelper
before_filter :load_category
before_filter :prepare_filter
before_filter :check_search_whole_site
protected
def search(finder, query)
finder.find_by_contents(query).sort_by do |hit|
-(relevance_for(hit))
end
end
def prepare_filter
@finder = @category || @environment
end
def check_search_whole_site
if params[:search_whole_site] == 'yes'
redirect_to params.merge(:category_path => [], :search_whole_site => nil)
end
end
def action_product_category
@products = category.products
@enterprises = category.products.map{|p| p.enterprise}.flatten.uniq
@users = category.consumers
end
def action_category
@recent_articles = category.recent_articles
@recent_comments = category.recent_comments
@most_commented_articles = category.most_commented_articles
end
alias :action_region :action_category
public
include SearchHelper
######################################################
SEARCH_IN = [
[ :articles, N_('Articles') ],
[ :comments, N_('Comments') ],
[ :enterprises, N_('Enterprises') ],
[ :people, N_('People') ],
[ :communities, N_('Communities') ],
[ :products, N_('Products') ]
]
# TODO don't hardcode like this >:-(
LIST_LIMIT = 10
def index
@query = params[:query] || ''
@filtered_query = remove_stop_words(@query)
@results = {}
@names = {}
SEARCH_IN.each do |key, description|
@results[key] = search(@finder.send(key), @filtered_query) if params[:find_in].nil? || params[:find_in].empty? || params[:find_in].include?(key.to_s)
@names[key] = gettext(description)
end
end
#######################################################
# view the summary of one category
def category_index
send('action_' + @category.class.name.underscore)
end
attr_reader :category
def assets
asset = params[:asset].to_sym
if !SEARCH_IN.map(&:first).include?(asset)
render :text => 'go away', :status => 403
return
end
@results = { asset => @finder.send(asset).recent(LIST_LIMIT) }
@asset_name = gettext(SEARCH_IN.find { |entry| entry.first == asset }[1])
@names = { asset => @asset_name }
end
def tags
@tags = Tag.find(:all).inject({}) do |memo,tag|
memo[tag.name] = tag.taggings.count
memo
end
end
def tag
@tag = Tag.find_by_name(params[:tag])
@tagged = @tag.taggings.map(&:taggable)
end
#######################################################
def popup
@search_in = SEARCH_IN
render :action => 'popup', :layout => false
end
end