使用Sinatra/Ruby在facebook验证时显示用户的唯一信息

使用Sinatra/Ruby在facebook验证时显示用户的唯一信息,ruby,sinatra,omniauth,datamapper,Ruby,Sinatra,Omniauth,Datamapper,这里是超级初学者 以下是我想做的: 构建一个基本的待办事项列表应用程序,用户X在其中登录facebook,添加一些项目,查看它们,然后注销。用户Y/Z/M/etc应该能够登录查看自己的列表,添加自己的项目等。 AKA:一个标准的web应用程序,您可以登录到自己的帐户并查看自己的信息。 到目前为止我所拥有的: 能够建立一个列表,登录Facebook,让它知道你的名字。 但是,无论是我登录还是我的朋友使用她的帐户登录,列表都保持不变。 我需要做什么,但不知道如何做: 我需要每个用户都能够创建和查看自

这里是超级初学者

以下是我想做的:
构建一个基本的待办事项列表应用程序,用户X在其中登录facebook,添加一些项目,查看它们,然后注销。用户Y/Z/M/etc应该能够登录查看自己的列表,添加自己的项目等。 AKA:一个标准的web应用程序,您可以登录到自己的帐户并查看自己的信息。

到目前为止我所拥有的:
能够建立一个列表,登录Facebook,让它知道你的名字。 但是,无论是我登录还是我的朋友使用她的帐户登录,列表都保持不变。

我需要做什么,但不知道如何做:
我需要每个用户都能够创建和查看自己的列表,并且能够返回到列表中,仍然可以看到/添加到列表中,等等。

我甚至不知道这叫什么,这是一个用户数据库,每个用户都有自己的数据集吗?是否需要设置列表,以便将其存储为数据块? 是否与此有关:如果是,是什么

如果有人能给我一些非常基本的指导,比如从这里去哪里,任何教程,或者我应该在谷歌上搜索什么,那就太棒了

下面是我的主要代码(警告:它真的很乱):

需要“sinatra”
需要“数据映射器”
需要“时间”
需要“rubygems”
需要“json”
需要“omniauth”
需要“omniauth facebook”
#TODO需要“omniauth att”
范围='电子邮件,阅读流'
DataMapper::setup(:默认值,“sqlite3://{Dir.pwd}/queue.db”)
类sinatrapp:frame\u选项
结束
课堂笔记
包含数据映射器::资源
属性:id,序列号
属性:content,Text,:required=>true
属性:complete,Boolean,:required=>true,:default=>false
属性:创建于,日期时间
属性:更新于,日期时间
结束
类用户
包含数据映射器::资源
属性:id,序列号
属性:uid,字符串
属性:名称、字符串
属性:创建于,日期时间
结束
######不知道这是干什么的##############
DataMapper.finalize
DataMapper.auto_升级!
启用:会话
使用OmniAuth::Builder do
提供者:facebook,'46464630283595639','5e4c7ad43bf111c10287c981d51127a3',:范围=>范围,:显示=>“弹出窗口”
#提供者:att,'client\u id','client\u secret',:callback\u url=>(ENV['BASE\u DOMAIN']
结束
######根##############
获取“/”do
如果当前用户
@notes=Note.all:order=>:id.desc
@标题='电影队列'
雇员再培训局:家
其他的
' '
结束
结束
######认证##############
[“/sign_in/?”,“/signup/?”]。每个都有路径|
走捷径
重定向“/auth/facebook”
结束
结束
获取“/auth/:name/callback”do
auth=request.env[“omniauth.auth”]
user=user.first_或_create({:uid=>auth[“uid”]}{
:uid=>auth[“uid”],
:name=>auth[“first_name”],
:created_at=>Time.now})
会话[:user\u id]=user.id
重定向“/”
结束
帮手
def当前用户
@当前_user | |=user.get(会话[:user_id]),如果会话[:user_id]
结束
结束
##列表制作部分###
发布“/”do
n=注释。新
n、 内容=参数[:内容]
n、 拯救
重定向“/”
结束
获取“/:id/delete”do
n=Note.get参数[:id]
如果毁灭
重定向“/”,:notice=>“注释已成功删除。”
其他的
重定向“/”,:error=>“删除注释时出错。”
结束
结束
获取“/:id/complete”do
n=Note.get参数[:id]
n、 完成=完成?0:1#翻转它
n、 拯救
重定向“/”
结束
##########注销和错误处理程序#############
获取“/注销”操作
会话[:用户\u id]=无
重定向“/”
结束
获取“/auth/failure”do
erb“身份验证失败:消息:#{params}”
结束
获取“/auth/:提供程序/取消授权”do
erb“#{params[:provider]}已取消此应用的授权。”
结束
获取“/protected”do
抛出(:暂停,[401,“未授权\n”]),除非会话[:已验证]
erb“#{request.env['omniauth.auth'].to_json}
" 结束 结束 ##########我不知道这是什么############# sinatrapp.run!如果文件=0美元
免责声明:我不知道Datamapper,但这应该可以让您继续


需要有一种方法将注释与用户关联。这需要数据库中的一个表,有些人会称之为
users\u notes
,我个人更喜欢
users\u rel\u notes
,(也许Datamapper对此有一个约定…YMMV)。无论如何,该表将至少有2列-用户id和便笺id。您不需要像我之前写的那样使用单独的表(对不起,我缺少一点睡眠!),这将适用于多对多关系,其中一个用户可以有多个便笺,并且一个便笺可以与多个用户关联。对于您所拥有的,如果只有便笺的所有者可以访问它,则需要一对多关系。您可以向
notes
表中添加一列以存储用户id

然后,在User类中,向Note类添加一个,它是一对多关联,在Datamapper中,它是一个
具有n
,例如

现在,当您有一个用户实例时,您可以(可能)通过以下方式调用该用户的注释:

我知道您已经定义了助手
current\u user
,因此如果有人登录,您可以调用
current\u user.notes
以获取登录用户的所有注释


请记住,当您通过
user.notes添加便笺以确保将记录添加到关联表中时,(可能,请阅读链接),顺便说一句,我认为您迄今为止所取得的成就对自称为超级初学者的人来说是非常令人印象深刻的(我知道这听起来很有帮助,对不起!但对您来说很荣幸)我认为她有点作弊,在这里偷偷粘贴了一些代码副本(注释“不知道这是什么”),但仍然很好:)顺便说一句,Helena
DataMapper.finalize/auto_upgrade
你可以找到这些解释
require 'sinatra'
require 'data_mapper'
require 'time'
require 'rubygems'
require 'json'
require 'omniauth'
require 'omniauth-facebook'
#TODO require 'omniauth-att'

SCOPE = 'email,read_stream'

DataMapper::setup(:default, "sqlite3://#{Dir.pwd}/queue.db")


class SinatraApp < Sinatra::Base
  configure do
    set :sessions, true
    set :inline_templates, true
    set :protection, :except => :frame_options
end

class Note  
  include DataMapper::Resource  
  property :id, Serial  
  property :content, Text, :required => true  
  property :complete, Boolean, :required => true, :default => false  
  property :created_at, DateTime  
  property :updated_at, DateTime  
end 

class User
  include DataMapper::Resource
  property :id,         Serial
  property :uid,        String
  property :name,       String
  property :created_at, DateTime
end



###### no clue what this does ##############
DataMapper.finalize
DataMapper.auto_upgrade!

enable :session


use OmniAuth::Builder do
    provider :facebook, '464630283595639','5e4c7ad43bf111c10287c981d51127a3',:scope => SCOPE, :display => "popup"
    #provider :att, 'client_id', 'client_secret', :callback_url => (ENV['BASE_DOMAIN']
  end




###### root ##############

get '/' do
  if current_user
    @notes = Note.all :order => :id.desc  
    @title = 'Movie Queue'
    erb :home
  else
    ' <a href="/sign_in">sign in with Facebook</a>'
  end
end


###### authentication ##############

["/sign_in/?", "/signup/?"].each do |path|
  get path do
    redirect '/auth/facebook'
  end
end

get '/auth/:name/callback' do
  auth = request.env["omniauth.auth"]
  user = User.first_or_create({ :uid => auth["uid"]}, {
    :uid => auth["uid"],
    :name => auth["first_name"],
    :created_at => Time.now })
  session[:user_id] = user.id
  redirect '/'
end


helpers do
  def current_user
    @current_user ||= User.get(session[:user_id]) if session[:user_id]
  end
end



##list making part###
post '/' do  
  n = Note.new  
  n.content = params[:content]  
  n.save  
  redirect '/'  
end


get '/:id/delete' do
  n = Note.get params[:id]
  if n.destroy
    redirect '/', :notice => 'Note deleted successfully.'
  else
    redirect '/', :error => 'Error deleting note.'
  end
end

get '/:id/complete' do  
  n = Note.get params[:id]  
  n.complete = n.complete ? 0 : 1 # flip it  
  n.save  
  redirect '/'  
end


########## logout and error handlers #############

  get '/logout' do
    session[:user_id] = nil
    redirect '/'
  end

  get '/auth/failure' do
    erb "<h1>Authentication Failed:</h1><h3>message:<h3> <pre>#{params}</pre>"
  end

  get '/auth/:provider/deauthorized' do
    erb "#{params[:provider]} has deauthorized this app."
  end

  get '/protected' do
    throw(:halt, [401, "Not authorized\n"]) unless session[:authenticated]
    erb "<pre>#{request.env['omniauth.auth'].to_json}</pre><hr>
         <a href='/logout'>Logout</a>"
  end


end


########## don't know what this is #############


SinatraApp.run! if __FILE__ == $0
has n, :notes
user.notes