2

超级初学者在这里。

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

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

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

我什至不知道这怎么叫,这会是一个用户数据库,每个用户都有自己的数据集吗?是否需要设置列表以便将它们存储为一大块数据?是否与此有关:Sinatra 中的会话使用 Facebook 身份验证如果是,那是什么?

如果有人能给我一些非常基本的方向,告诉我从哪里开始,任何教程或我应该在谷歌上搜索什么,那就太棒了。

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

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
4

1 回答 1

0

免责声明:我不知道 Datamapper,但这应该可以帮助您。


需要有一种方法将便笺与用户关联起来。这需要数据库中的一个表,有些人会称之为users_notes,我个人更喜欢users_rel_notes,(也许 Datamapper 对此有一个约定...... YMMV)。无论如何,该表将至少有 2 列 - 用户 ID 和注释 ID。你不需要像我之前写的那样单独的表(我有点睡不着,抱歉!),这将是一个多对多的关系,用户可以有几个笔记,一个笔记可以与几个相关联用户。对于您所拥有的,只有笔记的所有者才能访问它,它需要一对多的关系。您可以在表中添加一列notes来存储用户 ID。

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

has n, :notes

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

user.notes

我看到你已经current_user定义了助手,所以如果有人登录,你可以打电话current_user.notes来取回登录用户的所有笔记。

请记住,当您添加注释以确保将记录添加到关联表时,(可能,阅读链接)通过user.notes << my_new_note.

会话是您为识别用户而保留的信息以及您可能经常需要的任何其他小信息。可能的情况是,您只是为用户存储一个 id 或标识他们的 facebook 令牌,然后在请求期间,如果需要,您将查看 cookie 内部,获取 id,通过以下方式查找该用户id 并获取一个用户实例。会话信息可以通过多种方式存储,最常见的是 cookie,但您可以使用任何用于存储任何其他数据的方式。

于 2013-01-18T11:02:58.003 回答