Posted by Dhaval Parikh on Jun 10, 2009
There are many articles posted under this topic but none of them have all information or a Step by Step guide of how to integrate OAuth for use with Twitter Apps and Rails.
So thought of posting one here. Here are few steps which you should follow. The code below is same as provided by the twitter wiki but i have made couple of changes and organized it to make it simple to understand
Step 1 : = You need to get your consumer key and consumer secret # from the twitter OAuth site under this link twitteroauth.
Step 2 := Install OAuth Gem with “gem install oauth” command on ur terminal
Step 3 := Generate a Scaffold using the following command and then migrate the table called “users” to ur database
ruby script/generate scaffold user screen_name:string token:string secret:string
rake db:migrate
Step 4 := Add the following code to your User Controller. Replace the key and secret code with yours
def self.consumer
# The readkey and readsecret below are the values you get during registration
OAuth::Consumer.new(“OmwO7wsjtYHjquu6bd6C4w”, “j1kZ6yzsqChkeQtToErUx2LnPQMsSPkXMkiy4F82sPA”,{ :site=>”http://twitter.com” })
end
def create
@request_token = UsersController.consumer.get_request_token
session[:request_token] = @request_token.token
session[:request_token_secret] = @request_token.secret
# Send to twitter.com to authorize
redirect_to @request_token.authorize_url
return
end
Now this is an important part where you need to set the call back url Which u will define while you register your app at twitter OAuth site. Again add this to the UserController
def callback
@request_token = OAuth::RequestToken.new(UsersController.consumer,
session[:request_token],
session[:request_token_secret])
# Exchange the request token for an access token.
@access_token = @request_token.get_access_token
@response = UsersController.consumer.request(:get, ‘/account/verify_credentials.json’,
@access_token, { :scheme => :query_string })
case @response
when Net::HTTPSuccess
user_info = JSON.parse(@response.body)
unless user_info['screen_name']
flash[:notice] = “Authentication failed”
redirect_to :action => :index
return
end
# We have an authorized user, save the information to the database.
@user = User.new({ :screen_name => user_info['screen_name'],:token => @access_token.token,:secret => @access_token.secret })
@user.save!
# Redirect to the show page
redirect_to(@user)
else
RAILS_DEFAULT_LOGGER.error “Failed to get user info via OAuth”
# The user might have rejected this application. Or there was some other error during the request.
flash[:notice] = “Authentication failed”
redirect_to :action => :index
return
end
end
end
As you can see from the comments this callback action exchanges the request token for an access token. Since the user is going to need to type in the username and password at Twitter I avoid prompting for it and instead we fetch that using a call to verify_credentials. This saves duplicate entry and makes it easier on the user. This also prevents users with multiple accounts from giving you one username and then using another when they login to twitter. The access token and secret are what is needed to act on behalf of a user, so those are saved to the database. The show action then uses this information to display some data like so:
def show
@user = User.find(params[:id])
# Get this users favorites via OAuth
@access_token = OAuth::AccessToken.new(UsersController.consumer, @user.token, @user.secret)
RAILS_DEFAULT_LOGGER.error “Making OAuth request for #{@user.inspect} with #{@access_token.inspect}”
@response = UsersController.consumer.request(:get, ‘/favorites.json’, @access_token,
{ :scheme => :query_string })
case @response
when Net::HTTPSuccess
@favorites = JSON.parse(@response.body)
respond_to do |format|
format.html # show.html.erb
end
else
RAILS_DEFAULT_LOGGER.error “Failed to get favorites via OAuth for #{@user}”
# The user might have rejected this application. Or there was some other error during the request.
flash[:notice] = “Authentication failed”
redirect_to :action => :index
return
end
Finally the views
<p>
<b>Screen name:</b>
<%=h @user.screen_name %>
</p>
<ul>
<% @favorites.each do |fav| %>
<li><b><%= fav['user']['screen_name'] %></b>: <%=h fav['text'] %></li>
<% end %>
</ul>
and
the new.html.erb
<h1>New user</h1>
<% form_for(@user) do |f| %>
<%= f.error_messages %>
<p>
We’ll be sending you to Twitter in a moment to login and grant us access.
Once you allow us in we’ll give you the super-cool feature
you’bve heard about.
</p>
<p>
<%= f.submit “Grant Access” %>
</p>
<% end %>
<%= link_to ‘Back’, users_path %>
Also Add validates_presence_of to the User model for screen_name, token and secret.
And in the routes.rb set the following route
map.connect ‘/callback’, :controller => ‘users’, :action => ‘callback’
Thats it you are ready for the twitter Login. Start the server and open localhost:3000/users
and you will see the magic.
These are all the steps. Post me a comment if you still face any isssues.
Tags: OAuth + twitter + rails, OAuth integration with rails, rails OAuth and Twitter, ruby on rails
Posted by Dhaval Parikh on May 20, 2009
Most of the new websites are having the feature of localization or internationalization on their site. With introduction of rails 2.3 this feature is provided by default But if you are still working in rails 2.0 or 2.1 then GlobalLite is the solution for you.. http://code.google.com/p/globalite/
How ever while implement it in one of my projects I noticed that the localized date time module used in the plugin has a problem when you have time_select tag in your form.
So when you use a time_select tag in your form it will generate an error message “Can’t convert nil into string”. The problem is in the file called localized_action_view.rb which you will find in plugins/globalite/lib/rails folder.
Apply the code below to get it fixed
def select_month(date, options = {}, html_options = {})
if options[:locale]
@original_locale = Locale.code
Locale.code = options[:locale]
end
val = date ? (date.kind_of?(Fixnum) ? date : date.month) : ”
if options[:use_hidden]
hidden_html(options[:field_name] || ‘month’, val, options)
else
month_options = []
monthnames = :date_helper_month_names.l
abbr_monthnames = :date_helper_abbr_month_names.l
month_names = options[:use_month_names] || (options[:use_short_month] ? abbr_monthnames : monthnames)
month_names.unshift(nil) if month_names.size < 13
1.upto(12) do |month_number|
month_name = if options[:use_month_numbers]
month_number
elsif options[:add_month_numbers]
month_number.to_s + ‘ – ‘ + month_names[month_number]
else
month_names[month_number]
end
month_options << ((val == month_number) ?
%(<option value=”#{month_number}” selected=”selected”>#{month_name}</option>\n) :
%(<option value=”#{month_number}”>#{month_name}</option>\n)
)
end
@selector = select_html(options[:field_name] || ‘month’, month_options, options)
Locale.code = @original_locale if options[:locale]
return @selector
end
# Locale.code = @original_locale if options[:locale]
# return @selector
end
You may even Comment the date module in the code plugins/globalite/lib/rails/localized_action_view.rb
this will make use of default rails date time. so nothing will get affected if you do this. But the solution mentioned about is a better one.
Njoi the power of Internationalization and make sure site global.
Tags: globalite plugin, globalite plugin error, internationalization in rails, localization in rails, ruby on rails, time_select tag error
Posted by Dhaval Parikh on May 5, 2009
Older version of file_coulmn plugin is not working in rails 2.2.
If you want to get working in rails 2.2 then you need to modify file_coulmn.rb file.
Update the line #619 in vendor/plugins/file_column/lib/file_column.rb from
Inflector.underscore(self.name).to_s,
to
ActiveSupport::Inflector.underscore(self.name).to_s,
Or you can download the latest plugin from the github.com: http://github.com/rust/file_column/
If you are looking to implement the old File column plugin you may visit
http://blog.dhavalparikh.co.in/2008/02/file-column-plugin/
Tags: file column, file upload in rails, filecolumn plugin, ruby on rails
Posted by Dhaval Parikh on Apr 4, 2009
Well I m going to cover the topic how to generate charts using rails. there are number of options available such as follows
Here are the plugins through which we can generate charts in rails
1) Gruff charts http://nubyonrails.com/articles/gruff-graphing-library-for-ruby
2) Sparklines http://nubyonrails.com/articles/sparklines-graph-library-for-ruby
3) Scruffy charts http://scruffy.rubyforge.org/
4) Ziya plugin http://liquidrail.com/2007/1/4/charting-the-rails/ (flash charts)
I found google charts the best of these..( ofcourse that suited my requirements). The gc4r plugin in rails is really helpful for easy integration of google charts in your rails application.
Here is how Charts are generated by Google API.
Install: ruby script/plugin install http://gc4r.googlecode.com/svn/trunk/
Supported features:
1.line chart
2.bar chart (vertical and horizontal)
3.pie chart (both 2D and 3D)
4.title, title color and size
5.data colors and legend
6.data scaling
7.multiple axis
#Controller
use_google_charts
#In method of controller
Default Chart or Hello World Chart
@chart = GoogleChart.new
Set the width of chart
@chart = GoogleLineChart.new :width => 300, :height => 200
Set the data
dataset = GoogleChartDataset.new :data => [10,50,4,10,16]
data = GoogleChartData.new :datasets => dataset
@chart = GoogleLineChart.new :width => 300, :height => 200
@chart.data = data
add a chart title
dataset = GoogleChartDataset.new :data => [10,50,4,10,16]
data = GoogleChartData.new :datasets => dataset
@chart = GoogleLineChart.new :width => 200, :height => 150, :title => ‘Java vs. Ruby Montly Job Opportunities’
@chart.data = data
Set title in array instead of string
dataset = GoogleChartDataset.new :data => [10,50,4,10,16]
data = GoogleChartData.new :datasets => dataset
@chart = GoogleLineChart.new :width => 200, :height => 150, :title => ['Java vs. Ruby', 'Montly Job Opportunities']
@chart.data = data
Multiple data in chart
dataset1 = GoogleChartDataset.new :data => [10,50,4,10,16]
dataset2 = GoogleChartDataset.new :data => [99, 81, 25, 54, 80]
data = GoogleChartData.new :datasets => [dataset1, dataset2]
@chart = GoogleLineChart.new :width => 200, :height => 150, :title => ['Java vs. Ruby', 'Montly Job Opportunities']
@chart.data = data
Add colors
dataset1 = GoogleChartDataset.new :data => [10,50,4,10,16],:color => ‘FF0000?
dataset2 = GoogleChartDataset.new :data =>[99,81,25,54,80],:color => ‘0000FF’
data = GoogleChartData.new :datasets => [dataset1, dataset2]
@chart = GoogleLineChart.new :width => 200, :height => 150, :title => ['Java vs. Ruby', 'Montly Job Opportunities']
@chart.data = data
Define legend
dataset1 = GoogleChartDataset.new :data =>[10,50,4,10,16],:color => ‘FF0000?, :title => ‘Java’
dataset2 = GoogleChartDataset.new :data=>[99,81,25,54,80],:color => ‘0000FF’, :title => ‘Ruby’
data = GoogleChartData.new :datasets => [dataset1, dataset2]
@chart = GoogleLineChart.new :width => 200, :height => 150, :title => ['Java vs. Ruby', 'Montly Job Opportunities']
@chart.data = data
Define Axis
dataset1 = GoogleChartDataset.new :data =>[10,50,4,10,16],:color => ‘FF0000?, :title => ‘Java’
dataset2 = GoogleChartDataset.new :data=>[99,81,25,54,80],:color => ‘0000FF’, :title => ‘Ruby’
data = GoogleChartData.new :datasets => [dataset1, dataset2]
axis = GoogleChartAxis.new :axis => [GoogleChartAxis::LEFT, GoogleChartAxis::BOTTOM]
@chart = GoogleLineChart.new :width => 250, :height => 150, :title => ['Java vs. Ruby', 'Montly Job Opportunities']
@chart.data = data
@chart.axis = axis
Define Right and X Axis
dataset1 = GoogleChartDataset.new :data=> [10,50,4,10,16],:color => ‘FF0000?, :title => ‘Java’
dataset2 = GoogleChartDataset.new :data=>[99,81,25,54,80],:color => ‘0000FF’, :title => ‘Ruby’
data = GoogleChartData.new :datasets => [dataset1, dataset2]
axis = GoogleChartAxis.new :axis => [GoogleChartAxis::LEFT, GoogleChartAxis::BOTTOM, GoogleChartAxis::RIGHT, GoogleChartAxis::BOTTOM]
@chart = GoogleLineChart.new :width => 300, :height => 200, :title => ['Java vs. Ruby', 'Montly Job Opportunities']
@chart.data = data
@chart.axis = axis
Define Bar Chart:
@chart = GoogleBarChart.new :width => 300, :height => 200, :title => ['Java vs. Ruby', 'Montly Job Opportunities']
Define 3D Pie Chart:
@chart = GooglePieChart.new :width => 400, :height => 200, :title => ['Java vs. Ruby', 'Montly Job Opportunities'], :chart_type => GooglePieChart::PIE_3D
#view:
<%= image_tag @chart.to_url %>
Tags: charts in rails, gc4r, gc4r in rails, google charts, ruby on rails
Posted by Dhaval Parikh on Apr 4, 2009
Want to do benchmark or stress testing on your rails applications? Then look @ httpref
What is httpref?
Httperf is a tool for measuring web server performance. It provides a flexible facility for generating various HTTP workloads and for measuring server performance. The focus of httperf is not on implementing one particular benchmark but on providing a robust, high-performance tool that facilitates the construction of both micro- and macro-level benchmarks. The three distinguishing characteristics of httperf are its robustness, which includes the ability to generate and sustain server overload, support for the HTTP/1.1 and SSL protocols, and its extensibility to new workload generators and performance measurements.
Source url : – http://www.hpl.hp.com/research/linux/httperf/
Steps to do
1) download httpref from http://sourceforge.net/projects/httperf/
2) install the tool
3) check out commands on http://www.hpl.hp.com/research/linux/httperf/httperf-man-0.9.pdf
Thats all
Find out how many http requests your site can handle..
Njoi
For more info you can post comments here
Tags: ruby on rails, Stress/Benchmark testing in rails