From 08aecce2251b36f9815cabb366e43f7a7469c720 Mon Sep 17 00:00:00 2001 From: Godwin Date: Sun, 13 Jul 2014 11:08:01 -0600 Subject: [PATCH] SEO work and resources page --- Gemfile | 1 + Gemfile.lock | 3 ++ app/assets/stylesheets/sass/_layout.scss | 3 +- app/controllers/conferences_controller.rb | 3 -- app/controllers/pages_controller.rb | 18 ++++++++++-- app/helpers/application_helper.rb | 16 +++++++++++ app/views/conferences/index.html.haml | 5 ++-- .../conferences/permission_denied.html.haml | 17 +++++++---- app/views/conferences/show.html.haml | 6 +++- app/views/layouts/application.html.haml | 10 ++----- app/views/organizations/index.html.haml | 1 + app/views/organizations/show.html.haml | 7 ++++- app/views/pages/home.html.haml | 1 - app/views/pages/permission_denied.html.haml | 9 ++++++ app/views/pages/resources.html.haml | 25 ++++++++++++++++ app/views/pages/translation_list.html.haml | 4 ++- app/views/pages/translations.html.haml | 4 ++- app/views/shared/_footer.html.haml | 2 +- app/views/shared/_navbar.html.haml | 2 +- config/Xsitemap.rb | 21 ++++++++++++++ config/robots-dev.txt | 2 ++ config/robots-live.txt | 3 ++ config/routes.rb | 3 ++ config/sitemap.rb | 27 ++++++++++++++++++ public/{robots.txt => Xrobots.txt} | 0 public/maps/Thumbs.db | Bin 0 -> 27136 bytes public/sitemap.xml.gz | Bin 0 -> 334 bytes 27 files changed, 164 insertions(+), 29 deletions(-) create mode 100644 app/views/pages/permission_denied.html.haml create mode 100644 app/views/pages/resources.html.haml create mode 100644 config/Xsitemap.rb create mode 100644 config/robots-dev.txt create mode 100644 config/robots-live.txt create mode 100644 config/sitemap.rb rename public/{robots.txt => Xrobots.txt} (100%) create mode 100644 public/maps/Thumbs.db create mode 100644 public/sitemap.xml.gz diff --git a/Gemfile b/Gemfile index dc72462..78cf550 100644 --- a/Gemfile +++ b/Gemfile @@ -29,6 +29,7 @@ gem 'paper_trail' gem 'font-awesome-rails' gem 'wysiwyg-rails' gem 'rails-assets-cdn' +gem 'sitemap_generator' group :development, :test do gem 'rspec' diff --git a/Gemfile.lock b/Gemfile.lock index 0cb5984..5daa25c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -279,6 +279,8 @@ GEM multi_json simplecov-html (~> 0.8.0) simplecov-html (0.8.0) + sitemap_generator (5.0.4) + builder slop (3.5.0) sorcery (0.8.6) bcrypt (~> 3.1) @@ -366,6 +368,7 @@ DEPENDENCIES sass-rails (~> 4.0.0) selenium-webdriver simplecov + sitemap_generator sorcery (>= 0.8.1) uglifier (>= 1.3.0) wdm (>= 0.1.0) diff --git a/app/assets/stylesheets/sass/_layout.scss b/app/assets/stylesheets/sass/_layout.scss index c9061b6..50182b7 100644 --- a/app/assets/stylesheets/sass/_layout.scss +++ b/app/assets/stylesheets/sass/_layout.scss @@ -5,11 +5,12 @@ */ html { - background-color: $white + background-color: $primary-color; } body { height: auto; + background-color: $white } #main-nav { diff --git a/app/controllers/conferences_controller.rb b/app/controllers/conferences_controller.rb index 1e2a6eb..a690b24 100644 --- a/app/controllers/conferences_controller.rb +++ b/app/controllers/conferences_controller.rb @@ -187,9 +187,6 @@ class ConferencesController < ApplicationController if current_user @host_privledge = :admin end - #if !@conference - # raise ActionController::RoutingError.new('Not Found') - #end end def set_conference_registration diff --git a/app/controllers/pages_controller.rb b/app/controllers/pages_controller.rb index 5ceb237..83a6c9e 100644 --- a/app/controllers/pages_controller.rb +++ b/app/controllers/pages_controller.rb @@ -1,13 +1,16 @@ include ApplicationHelper class PagesController < ApplicationController - #skip_before_filter :verify_authenticity_token, only: [:translate] + #skip_before_filter :verify_authenticity_token, only: [:translate] def home - @conferences = Conference.all + @conferences = Conference.all @conference = Conference.find(:first, :order => "start_date DESC") end + def resources + end + def translate key = params[:translationkey] value = params[:translationvalue] @@ -51,12 +54,18 @@ class PagesController < ApplicationController end def translations + if !current_user + raise ActiveRecord::PremissionDenied + end @lang = params[:lang] @translations = I18n.backend.get_translation_info I18n.config.enforce_available_locales = false end def translation_list + if !current_user + raise ActiveRecord::PremissionDenied + end total = 0 complete = 0 @completeness = Hash.new @@ -78,6 +87,11 @@ class PagesController < ApplicationController } end + def robots + robot = is_production? && !is_test_server? ? 'live' : 'dev' + render :text => File.read("config/robots-#{robot}.txt"), :content_type => 'text/plain' + end + private def store_translations(locale, data, options = {}) escape = options.fetch(:escape, true) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 08fd0f8..e0beb14 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -41,6 +41,10 @@ module ApplicationHelper content_for(:title) { page_title.to_s } end + def description(page_description) + content_for(:description) { page_description.to_s } + end + def banner_image(banner_image, name: nil, id: nil, user_id: nil, src: nil) @@no_banner = false @@banner_image = banner_image @@ -459,6 +463,18 @@ module ApplicationHelper (Rails.application.config.action_controller.asset_host || '') + file end + def is_production? + Rails.env == 'production' + end + + def subdomain + request.env['SERVER_NAME'].gsub(/^(\w+)\..*$/, '\1') + end + + def is_test_server? + subdomain == 'test' + end + private def _form_field(type, name, value, options) if type == 'check_box' diff --git a/app/views/conferences/index.html.haml b/app/views/conferences/index.html.haml index 1f71861..589f737 100644 --- a/app/views/conferences/index.html.haml +++ b/app/views/conferences/index.html.haml @@ -1,4 +1,5 @@ -- title _'page.Conferences' +- page_name = 'All '+(@conference_type ? @conference_type.title+' ' : '')+' Conferences' +- title page_name - banner_image '/assets/conference.jpg' - page_style :list - content_for :banner do @@ -6,7 +7,7 @@ .columns %h1=_'page.Conferences' -%h2='All '+(@conference_type ? @conference_type.title+' ' : '')+' Conferences' +%h2=page_name %ul.small-block-grid-1.medium-block-grid-2.large-block-grid-3.conference-list.preview-list - @conferences.each do |conference| diff --git a/app/views/conferences/permission_denied.html.haml b/app/views/conferences/permission_denied.html.haml index b4838c9..540a329 100644 --- a/app/views/conferences/permission_denied.html.haml +++ b/app/views/conferences/permission_denied.html.haml @@ -1,8 +1,13 @@ -- title 'Bike!Bike!' +- title @conference.title = render 'header' -.row - %h1 - =_'error.title.Permission_Denied' - %p - =_'error.desc.permission_denied', :p \ No newline at end of file +%article.row + .columns.large-10 + %h1=_'error.title.Permission_Denied' + %p=_'error.desc.permission_denied', :p + +- content_for :side_bar do + %h5= @conference.title+' is hosted by:' + %ul.preview-list.org-list.small-block-grid-2.large-block-grid-1 + - @conference.organizations.each do |organization| + %li=render 'organizations/preview', :organization => organization \ No newline at end of file diff --git a/app/views/conferences/show.html.haml b/app/views/conferences/show.html.haml index 16799aa..84df7ac 100644 --- a/app/views/conferences/show.html.haml +++ b/app/views/conferences/show.html.haml @@ -1,4 +1,8 @@ -- title 'Bike!Bike!' +- location = @conference.organizations.first.locations.first +- location_name = location.city + ', ' + (location.territory ? Carmen::Country.coded(location.country).subregions.coded(location.territory).name : location.country) + +- title @conference.title +- description "#{@conference.title} conference in #{location_name} for DIY bicycle collectives, co-ops, and advocacy groups" = render 'header' = tabs! diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index d3463fd..716bbd5 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -3,17 +3,15 @@ %head %meta{ charset: 'utf-8' } %meta{ name: 'viewport', content: 'width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0' } - %title= yield_or_default :title, controller.action_name.titlecase - %meta{ name: 'description', content: (yield_or_default :description, 'Bike!Bike! is an international annual gathering organized by and for community bicycle projects') } + %title= (yield :title) + (content_for?(:title) ? ' | ' : '') + 'Bike!Bike!' + %meta{ name: 'description', content: (yield_or_default :description, 'Bike!Bike! conferences for DIY bicycle collectives, co-ops, and advocacy groups') } = csrf_meta_tags = yield :head - / Le HTML5 shim, for IE6-8 support of HTML elements /[if lt IE 9] = stylesheet_link_tag '//fonts.googleapis.com/css?family=Source+Sans+Pro:400,700,400italic,700italic', 'application', media: 'all' - / Touch icons %link{ href: asset_path('favicon.ico'), rel: 'shortcut icon', type: 'image/x-icon' } %link{ href: asset_path('favicon.ico'), rel: 'icon', type: 'image/x-icon' } %link{ href: asset_path('apple-touch-icon.png'), rel: 'apple-touch-icon' } @@ -21,10 +19,6 @@ %link{ href: asset_path('apple-touch-icon-114x114.png'), rel: 'apple-touch-icon', sizes: '114x114' } %link{ href: asset_path('apple-touch-icon-144x144.png'), rel: 'apple-touch-icon', sizes: '144x144' } - / - Le javascript - \================================================== - / Placed at the top of the document 'cause of turbolinks =# javascript_include_tag '//use.typekit.net/iqv7hcg.js' =# javascript_include_tag 'application' =# javascript_include_tag 'nested_form' diff --git a/app/views/organizations/index.html.haml b/app/views/organizations/index.html.haml index 65f81c9..8032b8b 100644 --- a/app/views/organizations/index.html.haml +++ b/app/views/organizations/index.html.haml @@ -1,4 +1,5 @@ - title _'page.Organizations' +- description 'Bike!Bike! list of DIY bicycle collectives, co-ops, coops, community bike projects, advocacy by country, state, provice, and city' - banner_image '/assets/orgs.jpg' - page_style :list - content_for :banner do diff --git a/app/views/organizations/show.html.haml b/app/views/organizations/show.html.haml index e58e738..da0f4fc 100644 --- a/app/views/organizations/show.html.haml +++ b/app/views/organizations/show.html.haml @@ -1,3 +1,8 @@ +- territory = Carmen::Country.coded(@organization.locations[0].country).subregions.coded(@organization.locations[0].territory) +- location_name = @organization.locations[0].city + (territory ? ' ' + territory.name : '') + ', ' + Carmen::Country.coded(@organization.locations[0].country).name + +- title @organization.name + ' (' + location_name + ')' +- description "#{@organization.name} is a bicycle collective, co-op, community bike project, or advocacy group in #{location_name}" - banner_image @organization.cover_url, id: @organization.cover_attribution_id, name: @organization.cover_attribution_name, user_id: @organization.cover_attribution_user_id, src: @organization.cover_attribution_src - page_style 'article' - content_for :banner do @@ -8,7 +13,7 @@ .columns.info{:class => (@organization.avatar.is_landscape? ? nil : ['medium-6', 'medium-pull-6'])} %h1=@organization.name - territory = Carmen::Country.coded(@organization.locations[0].country).subregions.coded(@organization.locations[0].territory) - %h2=@organization.locations[0].city + (territory ? ' ' + territory.name : '') + ', ' + Carmen::Country.coded(@organization.locations[0].country).name + %h2=location_name %p#notice= notice diff --git a/app/views/pages/home.html.haml b/app/views/pages/home.html.haml index a394d0a..03b95a7 100644 --- a/app/views/pages/home.html.haml +++ b/app/views/pages/home.html.haml @@ -1,4 +1,3 @@ -- title 'Bike!Bike!' - has_no_content - this_is_the_front_page - if @conference diff --git a/app/views/pages/permission_denied.html.haml b/app/views/pages/permission_denied.html.haml new file mode 100644 index 0000000..ad367c9 --- /dev/null +++ b/app/views/pages/permission_denied.html.haml @@ -0,0 +1,9 @@ +- page_title = _'error.title.Permission_Denied' +- title page_title +- banner_title page_title + +.row + %h1 + ='This page is inaccessible to you' + %p + =_'error.desc.permission_denied', :p \ No newline at end of file diff --git a/app/views/pages/resources.html.haml b/app/views/pages/resources.html.haml new file mode 100644 index 0000000..c75c300 --- /dev/null +++ b/app/views/pages/resources.html.haml @@ -0,0 +1,25 @@ +- page_title = 'Bike!Bike! Reources' +- title page_title +- banner_title page_title +- description 'Bike!Bike! list of resources - Bike Collective Wiki, ThinkTank, Bike!Bike! photos and documents' + +.row + .columns + %p + Here is a list of online resources available to commmunity bike projects. The bike collective wiki in particlular has great start up kits and many helpful articles about how community bike shops operate.  The think tank is a list serve with over 600 contributors. When you join the list, you can talk to community bike shops from all over the world about how to better organize and operate a shop. + %ul + %li + %a{href: 'http://www.bikecollectives.org/wiki/index.php?title=Main_Page', target: '_blank'} + Bike Collective Wiki + %li + %a{href: 'http://lists.bikecollectives.org/listinfo.cgi/thethinktank-bikecollectives.org', target: '_blank'} + Think tank sign up + %li + %a{href: 'http://www.flickr.com/photos/93412361@N07/with/8494632542/', target: '_blank'} + flickr bikebike! + %li + %a{href: 'https://www.dropbox.com/sh/4phyl9lft18whzi/SXQ6XUklKB', target: '_blank'} + Drop box for bikebike2012 (shared public box) + + %p + If you have more resources you think should be listed here, please post them to the issue tracker for the bikebike! website. \ No newline at end of file diff --git a/app/views/pages/translation_list.html.haml b/app/views/pages/translation_list.html.haml index cc879a6..7383245 100644 --- a/app/views/pages/translation_list.html.haml +++ b/app/views/pages/translation_list.html.haml @@ -1,4 +1,6 @@ -- banner_title 'Translations' +- page_title = 'Translations' +- title page_title +- banner_title page_title .row %h1 diff --git a/app/views/pages/translations.html.haml b/app/views/pages/translations.html.haml index 87e8e63..3d2eed0 100644 --- a/app/views/pages/translations.html.haml +++ b/app/views/pages/translations.html.haml @@ -1,4 +1,6 @@ -- banner_title (_ 'language_translations', vars: {:language => (_ ('languages.' + @lang))}) +- page_title = (_ 'language_translations', vars: {:language => (_ ('languages.' + @lang))}) +- title page_title +- banner_title page_title - page_style :form .row diff --git a/app/views/shared/_footer.html.haml b/app/views/shared/_footer.html.haml index 15cc8e6..f4b00eb 100644 --- a/app/views/shared/_footer.html.haml +++ b/app/views/shared/_footer.html.haml @@ -4,7 +4,7 @@ %i %a{href: '/conferences/'}='Organizations' %i - %a{href: '/conferences/'}='Zine' + %a{href: '/resources/'}='Resources' .columns.medium-3.large-3.text-right ©2014 Bike!Bike! diff --git a/app/views/shared/_navbar.html.haml b/app/views/shared/_navbar.html.haml index 32e1c30..dc634f4 100644 --- a/app/views/shared/_navbar.html.haml +++ b/app/views/shared/_navbar.html.haml @@ -7,4 +7,4 @@ .buttons = link_to (_'Conferences'), :conferences, {:class => ['button', 'conference']} = link_to (_'Organizations'), {:controller => :organizations}, {:class => ['button', 'organization']} - = link_to (_'Zine'), 'http://zinezine.bikebike.org', :class => ['button', 'article'] + = link_to (_'Resources'), '/resources/', :class => ['button', 'article'] diff --git a/config/Xsitemap.rb b/config/Xsitemap.rb new file mode 100644 index 0000000..4dcd08a --- /dev/null +++ b/config/Xsitemap.rb @@ -0,0 +1,21 @@ +SitemapGenerator::Sitemap.default_host = "http://hackingoff.com" + +SitemapGenerator::Sitemap.create do + routes = Rails.application.routes.routes.map do |route| + {alias: route.name, path: route.path.spec.to_s, controller: route.defaults[:controller], action: route.defaults[:action]} + end + + # Set a list of controllers you don't want to generate routes for. + # /rails/info in particular maps to something inaccessible. + # redirects have a nil controller. This prevents duplicate content penalties. + banned_controllers = ["rails/info", nil] + routes.reject! {|route| banned_controllers.include?(route[:controller])} + + # sitemap_generator includes root by default; prevent duplication + routes.reject! {|route| route[:path] == '/'} + + routes.each {|route| add route[:path][0..-11]} # Strips off '(.:format) + + # Notice the below if you're hosting Jekyll/Octopress in a subdirectory + # or otherwise want to index content outside of Rails' routes. + # add_to_index '/path/sitemap.xml' \ No newline at end of file diff --git a/config/robots-dev.txt b/config/robots-dev.txt new file mode 100644 index 0000000..1f53798 --- /dev/null +++ b/config/robots-dev.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: / diff --git a/config/robots-live.txt b/config/robots-live.txt new file mode 100644 index 0000000..e71a311 --- /dev/null +++ b/config/robots-live.txt @@ -0,0 +1,3 @@ +User-agent: * +Disallow: /translations/ +Disallow: /login/ diff --git a/config/routes.rb b/config/routes.rb index 8ff699a..8381a68 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -60,6 +60,9 @@ BikeBike::Application.routes.draw do get "oauth/callback" => "oauths#callback" get "oauth/:provider" => "oauths#oauth", :as => :auth_at_provider + get 'robots.txt' => 'pages#robots' + get 'resources' => 'pages#resources' + root 'pages#home' end diff --git a/config/sitemap.rb b/config/sitemap.rb new file mode 100644 index 0000000..fb2beb1 --- /dev/null +++ b/config/sitemap.rb @@ -0,0 +1,27 @@ +# Set the host name for URL creation +SitemapGenerator::Sitemap.default_host = "http://bikebike.org" + +SitemapGenerator::Sitemap.create do + # Put links creation logic here. + # + # The root path '/' and sitemap index file are added automatically for you. + # Links are added to the Sitemap in the order they are specified. + # + # Usage: add(path, options={}) + # (default options are used if you don't specify) + # + # Defaults: :priority => 0.5, :changefreq => 'weekly', + # :lastmod => Time.now, :host => default_host + # + # Examples: + # + # Add '/articles' + # + # add articles_path, :priority => 0.7, :changefreq => 'daily' + # + # Add all articles: + # + # Article.find_each do |article| + # add article_path(article), :lastmod => article.updated_at + # end +end diff --git a/public/robots.txt b/public/Xrobots.txt similarity index 100% rename from public/robots.txt rename to public/Xrobots.txt diff --git a/public/maps/Thumbs.db b/public/maps/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..f45eec370fc4cdd897301f781ca6915ddbdd4e54 GIT binary patch literal 27136 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 literal 0 HcmV?d00001