尝试创建要在我的索引中显示的新推文,但我不想离开该页面。我的应用程序所需的功能是从tweetstream跟踪推文,并自动将该信息传递到我的推文对象并保存到数据库。
控制器:
class TweetsController < ApplicationController
TWITTER_COMSUMER_KEY = "GfqdzJKb5kIyEnYlQuNGlg"
TWITTER_CONSUMER_SECRET = "A3Fe0IvDbhlKgowCVmV1WVLlcdYgQ8w9clrDSegCQ"
TWITTER_OATH_TOKEN = "34012133-caUYq3eiNC7Z9L9KvTgG51VgyctqVxkXP0tKIXDk0"
TWITTER_OATH_TOKEN_SECRET = "DSLA3F8BPssyEeEP2wZgQ1OJRL5kIVPZfON4GYZFw"
TweetStream.configure do |config|
config.consumer_key = TWITTER_COMSUMER_KEY
config.consumer_secret = TWITTER_CONSUMER_SECRET
config.oauth_token = TWITTER_OATH_TOKEN
config.oauth_token_secret = TWITTER_OATH_TOKEN_SECRET
end
def index
@tweets = Tweet.all
end
def new
@tweet = Tweet.new
end
def create
TweetStream.track('bed', 'morning', 'breakfast') do |status|
temp = status.text
if(temp.include? "http")
@tweet = Tweet.new(status.text)
if @tweet.save
else
render "new"
end
end
end
end
def show
end
end
Index.html.erb
<h1>Tweet Tracker</h1>
<% @tweets.each do |tweet| %>
<p><%= tweet.content %></p>
<hr />
<% end %>
答案 0 :(得分:1)
这是RESTful资源结构(index / show / create / edit / destroy)的一种有趣的方法,因为我们使用自动跟踪器来创建而不是任何用户输入。问题是,您的控制器代码仅在POST请求访问时运行(除非您已经与routes.rb混淆以使其响应其他内容)。
我认为最干净的解决方案是编写一个咖啡脚本,定期将数据发布到控制器并显示结果。
$ ->
setInterval ->
$.post("/tweets", "", (html)->
$("#tweets").append html)
, 1000
<p><%= @tweet.content %></p>
<br/>
为了使其工作正常,我们需要将推文区域包含在id =“tweets”的div中:
<h1>Tweet Tracker</h1>
<div id="tweets">
<% @tweets.each do |tweet| %>
<p><%= tweet.content %></p>
<br/>
<% end %>
</div>
您还希望将控制器的create方法中的render "new"
替换为return
。这样,当保存到数据库失败时,不会呈现任何内容,并且一切都没有错误。
答案 1 :(得分:1)
你有两件大事:
第二位可以通过一些简单的javascript轮询来完成,就像@ AustinMullins的回答一样。
第一位应不在控制器中完成 - 它们用于响应请求,偏离此类作业可能会导致意外行为或性能问题。
例如,我发现在Phusion Passenger上运行的网站上,服务器会创建一个处理请求的线程,然后在一定时间后杀死它如果它没有完成它自己,当然如果控制器开始收听一个无休止的输入流,它就不会。
相反,您应该获得一个可以从命令行启动的单独脚本。这是一个类似于我正在使用的例子:
<强>脚本/ tracker.rb 强>
#!/usr/bin/env ruby
ENV["RAILS_ENV"] ||= "production"
require File.dirname(__FILE__) + "/../config/environment"
TweetStream.configure do |config|
config.consumer_key = TWITTER_COMSUMER_KEY
config.consumer_secret = TWITTER_CONSUMER_SECRET
config.oauth_token = TWITTER_OATH_TOKEN
config.oauth_token_secret = TWITTER_OATH_TOKEN_SECRET
end
client = TweetStream::Client.new
client.track(*Keyword.pluck(:name)).each do |status|
Tweet.create(status.text)
end
<强>脚本/ tracker_ctl 强>
#!/usr/bin/env ruby
require 'rubygems'
require 'daemons'
Daemon.new('tracker.rb')
现在,您可以ssh进入您的服务器并运行script/tracker_ctl start
或script/tracker_ctl stop
。但你可能想做的是让控制器动作发出这些命令。