Search code examples
ruby-on-railsfacebookdryhelperbefore-filter

rails before_filter, facebook user agent and dynamic OpenGraph data


I want to render for facebook bot special data. I have og.html.erb

<!DOCTYPE html><html><head>
<meta property="og:title" content="<%= @og[:title] %>">
<meta property="og:type" content="website">
<meta property="og:url" content="<%= @og[:url] %>">
<meta property="og:description" content="<%= @og[:description] %>">
<meta property="fb:admins" content="100000235955045">
</head><body></body></html>

And this in my page controller:

# encoding: UTF-8
class PageController < ApplicationController
  def index
    @og = { :title => 'index title', :description => 'index desc', :url => 'http://someurl.com/index' }
    if request.headers['HTTP_USER_AGENT'].eql? 'facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)'
      render '/og', :layout => false
    end
  end

  def cv
    @og = { :title => 'cv title', :description => 'cv description', :url => 'http://someurl.com/cv/' }
    if request.headers['HTTP_USER_AGENT'].eql? 'facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)'
      render '/og', :layout => false
    end
  end
end

How i can to DRY it? Am i need use helper or before_filter? If i will user before_filter, how i can set @og hash from my controller?


Solution

  • I think you can define a method in ApplicationController like this,

    def render_og
      if request.headers['HTTP_USER_AGENT'].eql? 'facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)'
        render '/og', :layout => false
      end
    end
    

    then your page controller becomes this,

    # encoding: UTF-8
    class PageController < ApplicationController
      def index
        @og = { :title => 'index title', :description => 'index desc', :url => 'http://someurl.com/index' }
        render_og
      end
    
      def cv
        @og = { :title => 'cv title', :description => 'cv description', :url => 'http://someurl.com/cv/' }
        render_og
      end
    end