reflex

Reflex is a gem that allows you to connect your application to the React Social API.

Install / Usage

1. Install Authlogic and setup your application

Install authlogic (github.com/binarylogic/authlogic) in your rails application, and set it up according to the authlogic docs (rdoc.info/projects/binarylogic/authlogic).

Take a look at the authlogic example app (github.com/binarylogic/authlogic_example), or use it as a basis, if you get stuck.

2. Install Reflex

Add the gem dependencies in your config:

Rails 2.3

Add the dependencies to your environment:

# config/environment.rb
config.gem "reflex"

And install them:

$ rake gems:install

Rails 3.0 (untested)

Add the dependencies to your Gemfile

# Gemfile
gem "reflex"

And install them:

$ bundle install

3. Generate the reflex_connections migration

Now that we have the reflex gem installed, we need to generate a migration that connects our users to a reflex provider:

Rails 2.3

$ script/generate reflex_connections_migration

Rails 3.0 (untested)

$ rails generate reflex_connections_migration

4. Configure the reflex gem

Create a reflex configuration file:

# config/reflex.yml
development: &DEFAULTS
  key: development_key
  secret: development_secret
  endpoint: http://social.react.com/XmlRpc_v2/

production:
  << DEFAULTS
  key: production_key
  secret: production_secret

5. Make sure you save your objects properly

Save your session objects with a block. Why? Because we need to redirect the user to their login provider so that they can authenticate. When we do this, we don’t want to execute that block of code, because if we do, we will get a DoubleRender error. Using a block allows us to skip that entire block and send the user along their way if they choose to authenticate via React’s OAuth Server.

You probably want to do this in your controllers. It should look something like this:

# app/controllers/user_session_controller.rb
def create
  @user_session.save do |result|
    if result
      flash[:notice] = "Login successful!"
      redirect_back_or_default 
    else
      render :action => :new
    end
  end
end

When creating new users, react_profile is set if available. In order to make use of this, alter your user class like this:

# app/models/user.rb
class User < ActiveRecord::Base
  acts_as_authentic

  def react_profile=(profile)
    self.name = profile['real_name'] || profile['user_name']
  end
end

6. Add providers to your login form

Add providers to your login form:

# app/views/new.html.erb
<h1>Log in</h1>
<% form_for(@user_session) do |f| %>
  <%= f.error_messages %>
  <h2>Log in with your account</h2>
  <p>
    <%= f.label :login %>
    <br>
    <%= f.text_field :login %>
  </p>
  <p>
    <%= f.label :password %>
    <br>
    <%= f.password_field :password %>
  </p>
  <p><%= f.submit "Login" %></p>

  <h2>Or log in via:</h2>
  <% Reflex::OAuthServer.get_providers.each do |provider| %>
    <%= f.submit provider, :name => "react_provider" %>
    <br>
  <% end %>
<% end %>

Connecting existing users to react

Ofcourse connecting an existing user to a social network should be as easy and straightforward as authenticating a new user. And luckilly it is!

Modify your user update method to accept a block:

# app/controllers/users_controller.rb
def update
  @user = User.find(params[:id])
  @user.attributes = params[:attributes]

  @user.save do |result|
    if result
      flash[:notice] = "User updated successfully!"
      redirect_to(@user)
    else
      render :action => :edit
    end
  end
end

And add the react providers in the view:

# app/views/users/edit.html.erb
<% form_for(@user) do |f| %>
  <%= f.error_messages %>
  <p>
    Connect to a provider:
    <br>
    <% Reflex::OAuthServer.get_providers.each do |provider| %>
      <%= f.submit provider, :name => "react_provider" %>
    <% end %>
  </p>

  <p><%= f.submit "Save" %></p>
<% end %>

Roadmap

The reflex gem is far from finished. Here are some of the upcoming features:

  1. Easily access the React API — If a user connected to, for example twitter, then it should be a matter of calling: ‘@user.twitter.update_status(“I’ve connected my Twitter profile”)‘

  2. Better support for connecting a previously connected user

Note on Patches/Pull Requests

  • Fork the project.

  • Make your feature addition or bug fix.

  • Add tests for it. This is important so I don’t break it in a future version unintentionally.

  • Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)

  • Send me a pull request. Bonus points for topic branches.

Copyright © 2010 Tom-Eric Gerritsen. See LICENSE for details.