diff --git a/app/controllers/tag_controller.rb b/app/controllers/tag_controller.rb index e76e73a5397..876ab600298 100644 --- a/app/controllers/tag_controller.rb +++ b/app/controllers/tag_controller.rb @@ -138,15 +138,10 @@ def show end def show_for_author + # try for a matching /wiki/_TAGNAME_ or /_TAGNAME_ @wiki = Node.where(path: "/wiki/#{params[:id]}").try(:first) || Node.where(path: "/#{params[:id]}").try(:first) @wiki = Node.find(@wiki.power_tag('redirect')) if @wiki&.has_power_tag('redirect') - if params[:id][-1..-1] == '*' # wildcard tags - @wildcard = true - @tags = Tag.where('name LIKE (?)', params[:id][0..-2] + '%') - else - @tags = Tag.where(name: params[:id]) - end - @tagname = params[:id] + default_type = if params[:id].match('question:') 'questions' else @@ -156,21 +151,34 @@ def show_for_author # params[:node_type] - this is an optional param # if params[:node_type] is nil - use @default_type @node_type = params[:node_type] || default_type - @user = User.find_by(name: params[:author]) - @title = "'" + @tagname.to_s + "' by " + params[:author] + node_type = 'note' if @node_type == 'questions' || @node_type == 'note' + node_type = 'page' if @node_type == 'wiki' + node_type = 'map' if @node_type == 'maps' qids = Node.questions.where(status: 1).collect(&:nid) + + if params[:id][-1..-1] == '*' # wildcard tags + @wildcard = true + @tags = Tag.where('name LIKE (?)', params[:id][0..-2] + '%') + else + @tags = Tag.where(name: params[:id]) + end + @tagname = params[:id] + @user = User.find_by(name: params[:author]) + nodes = Tag.tagged_nodes_by_author(@tagname, @user) - .paginate(page: params[:page], per_page: 24) + .where(status: 1, type: node_type) + .paginate(page: params[:page], per_page: 24) + + # breaks the parameter + # sets everything to an empty array + set_sidebar :tags, [params[:id]] @notes = nodes.where('node.nid NOT IN (?)', qids) if @node_type == 'note' - @unpaginated = true - node_type = 'note' if @node_type == 'questions' || @node_type == 'note' - node_type = 'page' if @node_type == 'wiki' - node_type = 'map' if @node_type == 'maps' @questions = nodes.where('node.nid IN (?)', qids) if @node_type == 'questions' @wikis = nodes if @node_type == 'wiki' @nodes = nodes if @node_type == 'maps' + @title = "'" + @tagname.to_s + "' by " + params[:author] # the following could be refactored into a Tag.contributor_count method: notes = Node.where(status: 1, type: 'note') .select('node.nid, node.type, node.uid, node.status, term_data.*, community_tags.*') @@ -196,6 +204,7 @@ def show_for_author end end + def widget num = params[:n] || 4 nids = Tag.find_nodes_by_type(params[:id], 'note', num).collect(&:nid) diff --git a/app/models/tag.rb b/app/models/tag.rb index a32171412d4..cc46a6bf0be 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -246,17 +246,17 @@ def self.trending(limit = 5 , start_date = DateTime.now - 1.month , end_date = D def self.tagged_nodes_by_author(tagname, user_id) if tagname[-1..-1] == '*' @wildcard = true - Node.where('term_data.name LIKE(?)', tagname[0..-2]+'%') - .includes(:node_tag, :tag) - .references(:term_data) - .order('node.nid DESC') - .where('node.uid = ?', user_id) + Node.includes(:node_tag, :tag) + .where('term_data.name LIKE(?) OR term_data.parent LIKE (?)', tagname[0..-2]+'%', tagname[0..-2]+'%') + .references(:term_data, :node_tag) + .where('node.uid = ?', user_id) + .order('node.nid DESC') else - Node.where('term_data.name = ?', tagname) - .includes(:node_tag, :tag) - .order('node.nid DESC') - .references(:term_data) - .where('node.uid = ?', user_id) + Node.includes(:node_tag, :tag) + .where('term_data.name = ? OR term_data.parent = ?', tagname, tagname) + .references(:term_data, :node_tag) + .where('node.uid = ?', user_id) + .order('node.nid DESC') end end diff --git a/app/views/tag/show.html.erb b/app/views/tag/show.html.erb index 4cb4de843f2..86f8bb8e517 100644 --- a/app/views/tag/show.html.erb +++ b/app/views/tag/show.html.erb @@ -63,8 +63,8 @@ <% unless @wildcard %>

<%= raw t('tag.show.ask_question', :tag => params[:id].gsub('question:', '')) %> <%= raw t('tag.show.or_subscribe_to_answer', :url1 => "/subscribe/tag/question:"+params[:id].gsub('question:', '')) %>

<% end %>