我正在开发的Sinatra应用程序中使用ActiveRecord在数据库中创建新的模型行时遇到问题.正在创建的对象没有任何错误(使用save!,没有引发异常),但是我为保存指定的大多数数据都不存在.
class ProjectMeta < ActiveRecord::Base
attr_accessor :completion_ratio, :num_stories, :num_completed_stories, :original_target_date, :current_target_date
...
def self.create_from_project(project)
meta = ProjectMeta.new
meta.project_id = project.id
meta.num_stories = project.num_stories
meta.num_completed_stories = project.num_completed_stories
meta.completion_ratio = ProjectMeta.calculate_ratio(project.num_completed_stories, project.num_stories)
meta.current_target_date = project.current_target_date
meta.save!
meta
end
...
end
Run Code Online (Sandbox Code Playgroud)
对我正在发送的项目对象的数据进行的所有检查以及我正在创建的新元对象都显示数据存在.但是当我meta.inspect在保存之前和之后执行操作时,它会显示所有数据(除了project_id)都处于默认状态(零).我也检查过meta.errors.nil?,保存后没有任何错误.
最令人费解的是,如果我转向并使用该project_id获取新的元实例并将数据放入其中,则可以为数据库节省任何问题.
这让我感到很沮丧,因为我已经使用ActiveRecord在Rails和Sinatra中构建了几个站点.这个问题让我感到困惑.谁能告诉我我做错了什么?
我使用Sinatra和Rest-Graph gem构建了一个Facebook应用程序.现在我想将该应用程序嵌入Facebook页面中作为iframe选项卡.
为此,我需要signed_request通过Facebook 从发送到我的应用程序中获取数据.
Rest-Graph gem 在其Github页面上声明了以下功能:
用于提取access_token并检查cookie/signed_request中的sig的实用程序
我找不到任何关于如何使用这个"实用程序"的文档.你能指点我一些文档甚至更好,给我一个关于它如何与Ruby/Sinatra一起使用的例子?
ruby sinatra facebook-iframe facebook-page facebook-graph-api
我刚刚开始使用DataMapper,我正在试图弄清楚为什么需要指定a has和a belongs_to.
例如,查看DataMapper网站上的示例.这不是多余的吗?如果发表has n评论,那么评论会自动belongs_to发布吗?为什么我必须指定这个?
class Post
include DataMapper::Resource
property :id, Serial
has n, :comments
end
class Comment
include DataMapper::Resource
property :id, Serial
property :rating, Integer
belongs_to :post # defaults to :required => true
def self.popular
all(:rating.gt => 3)
end
end
Run Code Online (Sandbox Code Playgroud) 我使用以下代码启动并运行了一个页面(https://blooming-wind-8528.herokuapp.com/):
App.rb包含:
require 'rubygems'
require 'sinatra'
require 'open-uri'
require 'json'
#show page
get "/" do
profile = open("https://graph.facebook.com/me?access_token=#full_access_code_here_removed_for_stackoverflow#").read
profile = JSON.parse(profile)
@language = profile['locale'][0..1]
erb :nofan
end
#redirect for facebook
post "/" do
redirect "/"
end
Run Code Online (Sandbox Code Playgroud)
views/nofan.erb包含:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Stestie</title>
<meta property="og:title" content="No Fan"/>
<meta property="og:type" content="website"/>
<meta property="og:url" content="https://blooming-wind-8528.herokuapp.com/"/>
<meta property="og:image" content="https://blooming-wind-8528.herokuapp.com/images/marker_s.png"/>
<meta property="og:site_name" content="NO fan"/>
<meta property="fb:app_id" content="293597294002599" />
</head>
<body>
<p>App running in language: <%= @language %></p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
现在,奇怪的是:在浏览器中它完全加载.但是,在Facebook上它没有用.我得到一个空白的屏幕.但是,当我调用错误代码时(例如:将访问令牌更改为错误),我在iframe中获得了一个完整的sinatra错误页面...
有人知道我做错了什么吗?
谢谢!
我正在研究Sinatra项目,并在会话中设置了一些变量供以后使用.
我需要帮助的场景是我想访问中间件类中的会话对象.我正在使用warden进行身份验证.
我想在Middleware类中做类似的事情:
class MyMiddleware
def initialize(app, options={})
@app = app
end
def call(env)
puts "#{session.inspect}"
end
end
Run Code Online (Sandbox Code Playgroud)
这样做有可能吗?
思考?
我经历了一些博客和网站,它们给了我一些关于如何登录sinatra的信息,但没有为我的应用程序工作,我还经历了一个名为sinatra-logger的宝石没有尝试过,想知道理想和简单的"登录"方式在sinatra.就像我们为rails做logger.info一样.
我试过并且没有工作的代码来自以下站点链接,并且一些SO链接也指向上面链接中使用的相同方法.
configure do
LOGGER = Logger.new("sinatra.log")
end
helpers do
def logger
LOGGER
end
end
Run Code Online (Sandbox Code Playgroud)
我已经在我的应用程序的app.rb中写了这个,它无法为App:Module说未定义的方法`configure'
任何指针或指南都会有所帮助.谢谢.
编辑 现在正在使用文件写入来记录我的错误和消息:
File.open('log.txt', 'a') do |f|
f.write "#{status}-#{CONFIG.api_url}-#{data.inspect}-tweet}"
end
Run Code Online (Sandbox Code Playgroud) 我有一个Sinatra网络应用程序,我非常希望通过某些功能的流更新来增强.但是现在,我只是想学习使用流媒体数据的方法,这是我以前从未做过的.我有以下简单的测试代码:
在Sinatra:
get '/foo' do
stream do |out|
10.times do
out.puts "foo"
out.flush
sleep 1
end
end
end
get '/bar' do
erb :bar
end
Run Code Online (Sandbox Code Playgroud)
在bar.erb:
<body>
<div class="stream">
nothing.
</div>
</body>
<script type="text/javascript" charset="utf-8">
$(document).ready( function() {
$.get('/foo', function(html) {
$(".stream").html(html);
});
});
</script>
Run Code Online (Sandbox Code Playgroud)
我并不感到惊讶,这不是我想做的,也就是在写入时每个'foo'并动态更新页面.相反,没有任何事情发生约10秒然后我得到foo foo foo foo foo foo foo foo foo foo foo.
我的问题是,如何在ERB模板(使用Ruby,jQuery或其他方法)中提取流式数据,而不是阻塞,直到它全部被收集并立即全部吐出?
在Sinatra测试中,env['SERVER_NAME']默认为www.example.com。如何将其设置为任意域?
水豚有.default_host方法,但不使用水豚。
或者,是否可以更改env [ DEFAULT_HOST]?
使用RSpec,Sinatra,WebMock。
编辑:添加env['SERVER_NAME'] = 'www.foo.com'到RSpec测试引发异常:
NameError: undefined local variable or method 'env' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_1:0x007fe6ce3b5ff8>
如果Meteor.js非常适合我想要构建的应用程序,我正在努力解决这个问题.
该应用程序将完全基于Web,但需要我实现RESTful API,以暴露其一些功能.
这对Meteor.js是否可行,或者像Express/Sinatra这样的东西更适合吗?
我正在构建一个使用TweetStream的Sinatra应用程序(使用EventMachine侦听推文).我也希望该应用程序像普通的Sinatra应用程序一样提供页面,但似乎Sinatra在"倾听"推文时无法"收听"页面请求.
这是我可以通过使用不同的服务器或以不同的方式构建我的应用程序来解决的问题吗?我尝试过使用WebBrick和Thin.
这基本上就是我在做的事情:
class App < Sinatra::Base
# listening for tweets
@client = TweetStream::Client.new
@client.track(terms) do |status|
# do some stuff when I detect terms
end
get '/' do
"Here's some page content!"
end
end
Run Code Online (Sandbox Code Playgroud) sinatra ×10
ruby ×7
rack ×3
activerecord ×1
eventmachine ×1
express ×1
facebook ×1
iframe ×1
javascript ×1
logging ×1
meteor ×1
model ×1
rest ×1
rspec ×1
session ×1
tweetstream ×1
warden ×1
webmock ×1