0

我有一个简单的搜索设置,如果给出了搜索词,它使用 twitter gem api 来获取和保存一些推文。这是我的index行动HomeController,效果很好。

  def index
    Tweet.pull_tweets_from_search(params[:term]) unless params[:term].blank?
    @tweets ||= Tweet.latest
    @terms = Tweet.terms
  end

推文被保存和获取。我的代码有效。但我对此并不满意,因此想对其进行重构:

  def index
    @tweets ||= params[:term].blank? ? Tweet.latest : Tweet.pull_tweets_from_search(params[:term])
    @terms = Tweet.terms
  end

但这现在给了我一个错误:

undefined method `content' for #<Twitter::Tweet:0x007fd2b30bcc90>

pull_tweets_from_search在模型方面,我有一个具有以下方法的关注类:

    module ClassMethods
        def pull_tweets_from_search(term)
            if term
                search_and_add(term)
            else
                latest
            end
        end
    end

latest在我的模型类中恰好是一个看起来像这样的范围tweet.rb

scope :latest, ->{ order("created_at desc").limit(6) }

奇怪的是,这条推文确实是用内容属性保存的。它似乎只在出现内容变量的模板上窒息:

<% @tweets.each do |tweet| %>
    <blockquote>
        <em><%= parsed_text(tweet.content)  %></em>
        # ---

更新 获取和保存推文的实际代码如下所示:

         def search_and_add(term)
        Twitter.search(term, :lang => "en", count:5).results.each do |tweet|
            unless exists?(tweet_id: tweet.id)
                        create!(
                            term: term,
                            tweet_id: tweet.id,
                            content: tweet.text,
                            screen_name: tweet.user.screen_name
                        )
            end
           end
        end

当我重构时,这里出了什么问题?当属性确实存在时,为什么我会收到此错误?

4

2 回答 2

0

运算符的||=优先级高于? :运算符。见http://phrogz.net/ProgrammingRuby/language.html#table_18.4

添加括号,如下所示:

def index
  @tweets ||= (params[:term].blank? ? Tweet.latest : Tweet.pull_tweets_from_search(params[:term]))
  @terms = Tweet.terms
end
于 2013-07-30T05:08:30.237 回答
0

在您的search_and_add,Twitter.search.results返回一组具有 #text 而不是 #content 的对象。您在#each 块中创建正确的推文对象并不重要,当您完成枚举返回值时,返回值是带有#text 的事物的集合。

要让该方法返回您想要的对象类型,

def search_and_add(term)
  Twitter.search(term, :lang => "en", count:5).results.map do |tweet|
    where("tweet_id = ?", tweet.id).first ||
    create!(
      term: term,
      tweet_id: tweet.id,
      content: tweet.text,
      screen_name: tweet.user.screen_name
    )
  end
end
于 2013-07-30T05:35:51.580 回答