Posts Tagged ‘ruby on rails’

  • Tutorial for restful_authentication on Rails with Facebook Connect in 15 minutes

    [Update (10 April 2010): we've edited the tutorial to bring it up to date with the current incarnations of Facebook Connect, Facebooker and Rails.]

    Back in June 2007 I wrote a popular tutorial on writing Facebook platform applications with Ruby On Rails. Time has moved on and Facebook has launched Facebook Connect which allows you to integrate Facebook into your own sites allowing authentication, registration, friend connecting, and Facebook feed posting in the context of your application. Mashable has a great post on 10 great implementations of Facebook Connect including Joost, Vimeo and Disqus.

    At Made By Many we are fans of the possibilites of Facebook Connect for lowering barriers to registration, extracting social graph and injecting your social media functions into the daily online life of users. There is little point trying to create a “new” facebook on your site. Your unique social proposition lies elsewhere with your content, community and tools.

    People have found the integration of Facebook Connect tricky and while great libraries like facebooker handle the API part, actually getting the profile linking and integration flow is harder. So I’ve written this tutorial to integrate the most commonly used starter plugin for authentication and registration in Ruby On Rails, restful_authentication, with Facebook Connect to allow your users to login and register through Connect.

    First of all, let’s state what this integration is going to achieve:

    • As a user I can register to the site through entering my details so I can access all that great functionality
    • As a user I can login to the site through my entered username and password
    • As a user I can register to the site through Facebook Connect so I don’t have to fill in that form
    • As a user I can login to the site through Facebook Connect so I don’t have to remember two passwords
    • As a user I can connect my existing site user with my Facebook Connect user so I can later login through Facebook Connect

    We also have a constraint we need to consider:

    • As a user if I register a user through entering my details and later login through Facebook Connect I want to make sure I retain my old user account

    So read on and I’ll have you Connected in 15 minutes.
    Read full post

  • Protect The Human

    Our latest release, Protect The Human, a social campaigning platform developed for Amnesty International’s UK division, marks an important milestone in Made by Many’s life. It’s nearing our first birthday and on the back of the private beta release of Metrotwin, we quietly released Protect The Human to the world on Tuesday.

    A screenshot of the logged out homepage for protectthehuman.com

    Today is the first day that the wider world’s attention will be drawn to Protect The Human as it sees the release of tickets for Amnesty’s Secret Policeman’s Ball and the announcement from the High Court that evidence from Guantanamo prisoner Binyam Mohamed is admissible in his case to escape the death penalty. His case has been highlighted by Amnesty’s Individuals at Risk campaign for the past few years. (You can help raise awareness of his plight by taking action on Protect The Human.)

    The juxtaposition of these two events is classic Amnesty: the tricky balance of important human rights issues with the lighter side of life; and Made by Many, in collaboration with our Ruby on Rails development partner New Bamboo, are very proud to have played a part in helping Amnesty get the message out to the wider population.

    We worked very closely with Amnesty to define their online campaigning needs and ambitions before entering into a period of service definition to flesh out exactly what the site would do and how. The close relationship with Amnesty and New Bamboo continued throughout the project’s design and development. We’re looking forward to the future as Amnesty’s commitment to the web as an additional campaigning channel grows.

    The site was built over an intensive 3-month period using Agile project, design and development methodologies (more of which we’ll reveal in a future blog post) and in true Agile style, the site will continue to be improved with iterative releases. Keep an eye on the site (and this blog) for release of more features over the coming weeks.

    So what can you do on Protect The Human? Well, you can share, comment on and bookmark content from around the web to spread the word about human rights issues that matter to you.

    These are some of the quick, simple actions you can take on Protect The Human: rate; bookmark to digg, facebook, delicious et al; comment

    And you can show your support by contributing the smallest action. What we’re aiming to do is to encourage more people to get involved with human rights without banging the drum and coming over all heavy-handed.

    Your contribution can be as quick as a comment on a video, gallery or bookmark you’ve seen on Protect The Human. Or you could send it to a friend. For anyone who wants to spend a little more time, users can add their own bookmarks, create their gallery of images or upload a video relating to human rights.

    We anticipate that the site will significantly contribute to Amnesty UK’s target to engage with 1 million people by 2011.

    Stay tuned for a case study on the project with more detail on how we worked together with both Amnesty and New Bamboo.

  • Why we’re working with Rails

    A few weeks ago I was quoted in a New Media Age article about Ruby On Rails and the London agency market (available online for subscribers) and it’s worth following up a few things, especially on Made By Many’s involvement with Rails.

    At Made By Many we like to remain technology agnostic, which is why we don’t have a large team of developers. We feel this benefits us and our clients more by not overly invested in one thing that limits our creative output and may not be the best solution for our clients. This enables us to consult on the whole range of technology strategies and lets us play with best technologies around.

    That doesn’t mean we don’t have some favorites, and those are delivering massive benefits for our clients and fit with the creative work and processes we adopt. Is this regard Ruby On Rails has been a fantastic choice for some of the projects we have been working on, and it’s for the same reasons that Alex MacCaw and I have been so involved with it for the past few years.

    The creative solutions we architect and design are geared towards delivering bespoke functionality, exciter/delighter features and unique social propositions. This, combined with a strategy to release early and iterate, means we need development speed and a flexible framework. Working with Rails has given that and we have used it ourselves on a number of smaller projects as well as working with partners on three big new social media sites.

    This doesn’t mean it’s easy but we have been working with some real experts in New Bamboo and combining agile design and agile development approaches. The on-going issue with Rails is around effective and scalable deployment, Ruby itself it not as fast as other languages and Rails has seen some bloat slowing it down. This means you do need some expertise in creating some scalable applications, but with some prudent caching strategies and the beauty of memcached it’s more than possible. In the medium term these problems will disappear with Ruby 1.9, Enterprise Ruby and Rubinius making Ruby faster and continual Rails optimisations.

    I still believe that to get the best of Rails you need some experts, otherwise you’ll never see the flexibility and speed of the technology applied. We are seeing more and more calls for Rails developers and with firms such as the BBC, Endemol, Channel 4 and EMI already on Rails there is going to be a greater need. Hopefully we can continue to get great development expertise in London rather than see RoR degenerate to the state of PHP hacking (not that there aren’t some top-natch PHP outfits out-there).

    I think we’ll be working with Rails for a while but we are still working with PHP, Flex, AIR and lots of JQuery as well, but in the future we’ll be looking to work with the best technology around for our clients and our own projects.

  • Using Capistrano with PHP, specifically Wordpress

    Here at Made By Many we are technology agnostic. Primarily because we believe a client should use the best technology solutions to fit them and fit the problem we are trying to solve. We work with lots of in-house technology teams and out-sourced partners for clients, offering technology consultancy wrapped into a holistic offering on next-generation website problems.

    That’s not to say we don’t have technology preferences. With all things being equal for greenfield deployments we can work with the best technology to do the job. That’s why we have delivered several solutions using Ruby On Rails and use Wordpress for delivering blog solutions, such as this one.

    I’ve spent some time making Wordpress deployments as easy as Ruby On Rails using the excellent Capistrano, this also lets me control environments which are hosting both Wordpress and Ruby On Rails in the same way.

    Capistrano 2, while built for Ruby On Rails, can be used as a generic deployment tool with a little work. It adds capabilities to open-source infrastructures which were previously only available to things like high-end J2EE application servers. Here are some of the things to make Wordpress deployments with Capistrano.

    Some dependencies

    You are going to need rubygems and capistrano installed on your machine and apache on your server.

    Directory structure

    I use a directory server for my PHP applications which has parallels with a Rails directory, but because it’s PHP all of the code lives in the public directory. You are going to need this structure to separate out the PHP from the Capistrano files.

       wpproject        |______config   (this is for storing the capistrano deploy.rb file)        |______log      (for server logs)        |______private        |______public   (the webserver vhost root with all the PHP files)
      mkdir -p wpproject/config  mkdir -p wpproject/log  mkdir -p wpproject/private

    Capistranoing Wordpress

    Now we install the latest version of Wordpress.

      cd wpproject  svn export http://svn.automattic.com/wordpress/trunk/ public

    Great, now lets capistrano it, its a simple capify command away.

      capify .

    Now we have to make some recipes for capistrano. These will be our series of commands to make the deployments.

    Creating a Wordpress Deploy Setup Recipe

    I created an extensive Capistrano recipe for configuring a new instance of Wordpress, of which we’ll talk about the most basic setup.

    Open up wp/project/config/deploy.rb in your favourite editor.

    You need to add some setup tasks

    set :app_symlinks, ["wp-content/avatars","wp-content/uploads","wp-content/cache"]
    
    namespace :wordpress donamespace :symlinks do
    
    desc "Setup application symlinks in the public"task :setup, :roles => [:web] doif app_symlinksapp_symlinks.each { |link| run "mkdir -p #{shared_path}/public/#{link}" }endend
    
    desc "Link public directories to shared location."task :update, :roles => [:web] doif app_symlinksapp_symlinks.each { |link| run "ln -nfs #{shared_path}/public/#{link} #{current_path}/public/#{link}" }endsend(run_method, "rm -f #{current_path}/public/wp-config.php")send(run_method, "ln -nfs #{shared_path}/public/wp-config.php #{current_path}/public/wp-config.php")endendend

    This sets symlinks from the release directory under the current link to directories in shared. This is so that information such as avatars, uploads and cache are maintained between releases. This also deletes any development wp-config you may have deployed and link to the server one stored in the shared directory.

    This deployment scenario is also going to get Capistrano to create this wp-config for us.

    Adding the follow tasks to deploy.rb in the wordpress namespace

    set :wp_config_template, "wp-config.php.erb"
    
    task :wp_config_php, :roles => [:web] dofile = File.join(File.dirname(__FILE__), "templates", wp_config_template)template = File.read(file)buffer = ERB.new(template).result(binding)put buffer, "#{shared_path}/public/wp-config.php", :mode => 0444end

    And create the following file in a wpproject/config/templates directory

    wp-config.php.erb

    // ** MySQL settings ** //define('WP_CACHE', false); //Added by WP-Cache Managerdefine('DB_NAME', '<%=wp_db_name%>');    // The name of the databasedefine('DB_USER', '<%=wp_db_user%>');     // Your MySQL usernamedefine('DB_PASSWORD', '<%=wp_db_password%>'); // ...and passworddefine('DB_HOST', '<%=wp_db_host%>');    // 99% chance you won't need to change this valuedefine('DB_CHARSET', '<%=wp_db_charset%>');define('DB_COLLATE', '');
    
    // You can have multiple installations in one database if you give each a unique prefix$table_prefix  = 'wp_';   // Only numbers, letters, and underscores please!
    
    // Change this to localize WordPress.  A corresponding MO file for the// chosen language must be installed to wp-content/languages.// For example, install de.mo to wp-content/languages and set WPLANG to 'de'// to enable German language support.define ('WPLANG', '');
    
    /* That's all, stop editing! Happy blogging. */
    
    define('ABSPATH', '<%="#{current_path}/public/"%>');require_once(ABSPATH.'wp-settings.php');?>

    This is going to create our server wp-config file for us but you’ll need to set the variables in the deploy.rb file

    set :wp_db_name, "ourblog_wp"set :wp_db_user, "ourblog"set :wp_db_password, "pa55w0rd"set :wp_db_host, "localhost"set :wp_db_charset, "utf8"

    But wait there is more!! We can also create our apache vhost using the same method

    set :apache_server_name, "madebymany.co.uk"set :application, "ourblog"set :domain, "madebymany.co.uk"set :apache_server_aliases, []set :apache_ctl, "/etc/init.d/apache2"set :vhost_template, "wp_apache_vhost.erb"
    
    namespace :apache do
    
    task :vhost, :roles => [:web] doset :apache_vhost_aconf, "/etc/apache2/sites-available/#{application}"set :apache_vhost_econf, "/etc/apache2/sites-enabled/#{application}"
    
    server_aliases = []server_aliases << "www.#{apache_server_name}"server_aliases.concat apache_server_aliasesset :apache_server_aliases_array, server_aliases
    
    file = File.join(File.dirname(__FILE__), "templates", vhost_template)template = File.read(file)buffer = ERB.new(template).result(binding)put buffer, "#{shared_path}/httpd.conf", :mode => 0444send(run_method, "cp #{shared_path}/httpd.conf #{apache_vhost_aconf}")send(run_method, "rm -f #{shared_path}/httpd.conf")send(run_method, "ln -nfs #{apache_vhost_aconf} #{apache_vhost_econf}")end
    
    desc "Start Apache "task :start, :roles => :web dosudo "#{apache_ctl} start"end
    
    desc "Restart Apache "task :restart, :roles => :web dosudo "#{apache_ctl} restart"end
    
    desc "Stop Apache "task :stop, :roles => :web dosudo "#{apache_ctl} stop"endend

    This works with another Ruby builder (ERB) template file under wpproject/config/templates. In this example I’m using an Ubuntu Linux server with apache configuration installed under /etc/apache2 and a standard Debian setup using files under /etc/apache2/sites-available with a symlink from /etc/apache2/sites-enabled.

    #vhost for <%=apache_server_name%>    ServerName  <%=apache_server_name%>    <% apache_server_aliases_array.each do |a| %>      ServerAlias <%= "#{a}" %>    <% end %>    DocumentRoot <%= "#{current_path}/public" %>    <%= "#{current_path}/public" %>>      Options FollowSymLinks      AllowOverride All      Order allow,deny      Allow from all    
    
        RewriteEngine on
    
        # Prevent access to .svn directories    RewriteRule ^(.*/)?\.svn/ - [F,L]    ErrorDocument 403 "Access Forbidden"
    
        # Check for maintenance file and redirect all requests    RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f    RewriteCond %{SCRIPT_FILENAME} !maintenance.html    RewriteRule ^.*$ /system/maintenance.html [L]
    
        # Deflate    AddOutputFilterByType DEFLATE text/html text/plain text/xml    BrowserMatch ^Mozilla/4 gzip-only-text/html    BrowserMatch ^Mozilla/4\.0[678] no-gzip    BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
    
        ErrorLog <%= "#{current_path}/log/apache_error.log" %>    CustomLog <%= "#{current_path}/log/apache_access.log common" %>
    
    

    Almost done with configuration but it needs to be tied into the deploy:setup task.

    namespace :config do
    
    desc "Configure new wordpress install"task :default, :roles => [:web] dowordpress.wp_config_phpapache.vhostendend
    
    after   'deploy:setup', 'wordpress:config'before  'deploy:update_code', 'wordpress:symlinks:setup'after   'deploy:symlink', 'wordpress:symlinks:update'

    My deployment setup recipes are a bit more complex, creating the database, running the wordpress install scripts and bootstrapping with some users, but this should be enough to get you going for Wordpress or any other PHP CMS setups.

    We now need to make sure the deployment of releases works.

    Creating a Wordpress Release Recipe

    There are two basic options here. Capistrano allows you to release from your source control system such as SVN or Git, or alternatively you can do a copy from your local filesystem. Obviously if you are working in a team greater than one, I kinda hope you have source control.

    Assuming you have checked the entire wpproject into your SVN server. You need the following in your deploy.rb file.

    default_run_options[:pty] = trueset :keep_releases, 3set :use_sudo, trueset :user, "deploy"set :repository,  "svn+ssh://#{user}@madebymany.co.uk/var/svn/wpprojects/ourblog/trunk"set :deploy_to, "/var/www/apps/#{application}"set :deploy_via, :export
    
    role :app, "madebymany.co.uk"role :web, "madebymany.co.uk"role :db,  "madebymany.co.uk", :primary => true
    
    namespace :deploy dotask :restart, :roles => :app do# Do nothing or restart apache# apache.restartendend
    
    after   :deploy,'deploy:cleanup'

    And that’s it. The after hooks that modify the symlinks are handling the other areas of the deployment, so all we need to do is override the restart. You can get away with not restarting apache for sure but sometimes you can have APC cache issues.

    To deploy your Wordpress, create a database then:

      cap deploy:setup  cap deploy

    And you are ready to blog, when you need to make a release just cap deploy. Hopefully this is a good intro because you can use Capistrano with lots of PHP CMS’s using a similar setup.

Our latest tweets

Categories

Archives

Find us on the web