2013-01-18 56 views
2

超級初學者在這裏。當facebook認證時顯示用戶的獨特信息,與Sinatra /紅寶石

這裏就是我想要做的事:
建立一個基本的待辦事項清單app,其中在與Facebook用戶X原木,增加了一些項目,會看到他們,註銷。用戶Y/Z/M/etc應該能夠登錄查看他們的OWN列表,添加他們自己的物品等。 AKA:一個標準的網絡應用程序,您可以登錄到您的帳戶並查看您自己的信息。

我到目前爲止:
能夠建立一個列表,使用Facebook登錄並讓它知道你的名字。 但是,無論我登錄或我的朋友是否使用她的帳戶登錄,列表都保持不變。

我需要做的,不知道怎麼什麼:我
需要每個用戶能夠創建和看到自己的列表,並能夠回來給它,仍然可以看到它/加到它等

我甚至不知道這是如何調用,這是一個數據庫的用戶,每個都有自己的一套數據?列表是否需要設置,以便它們可以作爲一大塊數據存儲? 這是否與此有關:Sessions in Sinatra using Facebook authentication如果是這樣,什麼?

如果任何人都可以給我一些真的很基本的方向在何處何去何從,任何教程或者我應該google搜索,那會是真棒。

這裏是我的代碼主片(警告:這是真的很亂):

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 
+2

順便說一句,我認爲你到目前爲止取得的成績對於自稱是超級初學者的人來說是非常令人印象深刻的(我知道這聽起來光顧,對不起!但是對你有好感) – iain

+0

我認爲她騙了一點點並採用了一些鬼鬼祟祟的代碼複製粘貼在這裏(評論「不知道這是什麼」),但沒有其他更好的:)順便說一句。 Helena'DataMapper.finalize/auto_upgrade'你可以在[docs](http://datamapper.org/getting-started.html)中找到這些解釋。只需在該頁面上搜索這些條款即可。他們在該頁面上解釋。 – Casper

+0

我一定會看看。一直在做一些衝,但應退後一步,看看一些東西:)謝謝你們的幫助。 –

回答

0

免責聲明:我不知道DataMapper的,但這應該讓你去。


需要一種將筆記與用戶關聯的方法。 這需要數據庫中的表格,有些人會稱之爲 users_notes,我個人更喜歡 users_rel_notes,(也許Datamapper對此有一個約定... YMMV)。無論如何,該表至少有2列 - 用戶的ID和筆記ID。 你並不需要一個單獨的表,因爲我(我缺乏我有點睡眠,對不起!)之前寫的,那將是一個多對多的關係,其中一個用戶可以擁有多個音符和音符可以與關聯幾個用戶。對於你所擁有的,只有一個音符的所有者有權訪問它,它需要一個一對多的關係。您可以將一列添加到notes表中以存儲用戶標識。

然後,在User類中,向Note類中添加一個association,它是一對多關聯,並且在Datamapper中是has n,例如,

has n, :notes 

現在,當你有一個用戶實例,你可以(可能)通過撥打該用戶的注意事項:

我看你有沒有幫手current_user定義,因此,如果有人登錄您可以撥打current_user.notes取回登錄用戶的所有筆記。

請記住,當您添加註釋以確保您通過user.notes << my_new_note向關聯表添加記錄(可能是,請閱讀鏈接)。

會話是您持續識別用戶以及您可能經常需要的任何其他小信息的信息。可能性是,你只是爲用戶存儲一個id,或者是標識它們的facebook標記,然後在請求期間,如果需要的話,你會看到cookie內部,獲取id,通過查找該用戶該id並獲得一個用戶實例。會話信息可以以多種方式存儲,通常是Cookie,但您可以使用任何可用於存儲任何其他數據的內容。

+0

我認爲應該有一個反向關聯,它會出現在Notes類中:'belongs_to:user'不是嗎? – Kashyap

+1

@Kashyap只有當你發現你需要在某個時候調用'note.user'。如果代碼需要,我傾向於只寫一個關聯。 – iain