为什么我不能将推文保存到数据库中?

时间:2012-07-04 15:06:33

标签: ruby twitter ruby-on-rails-3.1 rubygems

我想将推文保存到数据库中,但它不起作用!我正在使用twitter gem。

我的控制器:

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

我的模特

require "rubygems"
require "twitter"


class Tweet < ActiveRecord::Base

end

我的观点

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

我的路线

Em2012tweet::Application.routes.draw do

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

显示以下错误:

未定义的方法`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:在'each'

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

2 个答案:

答案 0 :(得分:2)

  

将推文保存到数据库中

在Rails中,遵循REST约定,index操作与简单地显示已存储在数据库中的模型的所有对象相关联。这实际上也是你对代码所做的。您的index操作未执行任何将推文推送到数据库中的操作。

我认为你不想在这里保存推文。你试图简单地显示它们。如果您只想在索引视图文件中显示推文,请尝试此操作。

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

如果您想保存推文,请创建这样的动作。

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

答案 1 :(得分:0)

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

请注意,这需要您进行迁移,其中使用名为“twitter_tweet”的文本列创建tweets表,例如

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

      t.timestamps
    end
  end
end

这将允许您调用save_tweets_into_database并将25条返回的推文保存到数据库中。这不是一个非常好的策略,因为您要序列化每个Twitter::Status对象并将它们作为YAML存储在数据库中。这意味着您将无法使用所有优秀的ActiveRecord帮助程序,而是必须在实际使用它们之前反序列化您要使用的所有对象。更好的策略是创建一个ActiveRecord对象,该对象具有与要保存的Twitter :: Status对象中的属性相同的属性。然后,您可以将获取的Twitter :: Status对象映射到新的ActiveRecord Tweet对象,并保留使用ActiveRecord的所有好处。

我不会对你的路由结构说些什么,除了它肯定不会遵循'Rails'的方式,从经验来看,这通常会导致相当多的麻烦。