RoR_World
RoR_World

Reputation: 11

Why can I not save tweets into the database?

I want to save the tweets into the database, but it doesn't work! I'm using the twitter gem.

My controller:

class TweetsController < ApplicationController

def save_tweets_into_database
    @tweets = Twitter.search("#em2012" "#Italy" "#Spain", :lang => "en", :rpp => 25).results
    @tweets.each do |tweet|
        @tweet = tweet
        @tweet.create
    end
end
end

My Model

require "rubygems"
require "twitter"


class Tweet < ActiveRecord::Base

end

My view

<% @title = "liste" %>
<h2>Liste der Tweets über das EM-Finale</h2>
<ul>
    <% @tweets.each do |tweet| %>
        <li><%= tweet %></li>
    <% end %>
</ul>

my routes

Em2012tweet::Application.routes.draw do

  match '/save_tweets', to: 'tweets#save_tweets_into_database'
end

This error is displayed:

undefined method `create' for Twitter::Status:0x007fac9c80a160

Rails.root: /Users/xyz/Desktop/Workspace/em2012tweet

app/controllers/tweets_controller.rb:7:in `block in save_tweets_into_database'

app/controllers/tweets_controller.rb:5:in `each'

app/controllers/tweets_controller.rb:5:in `save_tweets_into_database'

Upvotes: 0

Views: 788

Answers (2)

Colin R
Colin R

Reputation: 17751

tweets_controller.rb:

class TweetsController < ApplicationController

  def save_tweets_into_database
    @tweets = Twitter.search("#em2012" "#Italy" "#Spain", :lang => "en", :rpp => 25)
    @tweets.each do |tweet|
      Tweet.create(twitter_tweet: tweet)
    end
  end
end

tweet.rb:

class Tweet < ActiveRecord::Base
  serialize :twitter_tweet
end

Note that this requires you have a migration where a tweets table is created with a text column named 'twitter_tweet', e.g.

class CreateTweets < ActiveRecord::Migration
  def change
    create_table :tweets do |t|
      t.text :twitter_tweets

      t.timestamps
    end
  end
end

This will allow you to call save_tweets_into_database and save the 25 returned tweets into the database. This isn't a very good strategy, as you are serializing each of the Twitter::Status objects and storing them as YAML in your database. This means you lose the ability to use all the nice ActiveRecord helpers, and instead must deserialize all of the objects you want to work with before actually using them. A better strategy would be to create an ActiveRecord object that has the same attributes as those in the Twitter::Status object you wish to save. Then you can map the fetched Twitter::Status objects to the new ActiveRecord Tweet objects and retain all the benefits of using ActiveRecord.

I'll not say anything about your routing structure, other than it definitely doesn't appear to be following the 'Rails' way, which, from experience, typically leads to quite a few headaches.

Upvotes: 0

Jason Kim
Jason Kim

Reputation: 19031

save the tweets into the database

In Rails, following REST convention, index action is associated with simply displaying all the objects of a model already stored in database. And this is actually what you did with the code as well. Your index action isn't doing anything that will save the tweets into the database.

I don't think you are trying to save tweets here. You are trying to simply display them. Try this if you want to simply display tweets in index view file.

def index
  @tweets = Twitter.search("#em2012" "#italy" "#spain", :lang => "en", :rpp => 25).results
end

If you want to save tweets, create an action like this.

def save_tweets_into_database
  @tweets = Twitter.search("#em2012" "#italy" "#spain", :lang => "en", :rpp => 25).results
  @tweets.each do |tweet|
    Tweet.save(tweet)
  end
end

Upvotes: 2

Related Questions