2

超初心者はこちら。

これが私がやろうとしていることです:
ユーザー X が facebook でログインし、いくつかのアイテムを追加し、それらを見て、ログアウトする基本的な to do リストアプリを構築します。ユーザー Y/Z/M/etc は、ログインして自分の OWN リストを表示したり、自分のアイテムを追加したりできるはずです。 別名: アカウントにログインして自分の情報を表示する標準の Web アプリ。

これまでのところ:
リストを作成し、Facebook でログインし、自分の名前を認識させる機能。 ただし、リストは、私がログインしても、友人が自分のアカウントでログインしても同じままです。

私がしなければならないこと、方法がわからない:
各ユーザーが自分のリストを作成して表示できるようにする必要があり、それに戻って引き続き表示/追加できるようにする必要があります。

これがどのように呼ばれているのかさえわかりません。これは、それぞれ独自のデータセットを持つユーザーのデータベースでしょうか? データのチャンクとして保存できるように、リストを設定する必要がありますか? これと何か関係がありますか : Facebook 認証を使用した Sinatra でのセッションもしそうなら、何?

ここからどこへ行くべきか、チュートリアル、または何をグーグルで調べるべきかについて、本当に基本的な指示を誰かが教えてくれたら、それは素晴らしいことです.

これが私の主なコードです(警告:本当に面倒です):

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は . いずれにせよ、テーブルには少なくとも 2 つの列 (ユーザー ID とメモ ID) があります。前に書いたように、別のテーブルは必要ありません (少し寝不足です。申し訳ありません!)。これは、ユーザーが複数のメモを持ち、1 つのメモが複数のメモに関連付けられる多対多の関係のためのものです。ユーザー。メモの所有者のみがアクセスできる場合、1 対多の関係が必要です。テーブルに列を追加してnotes、ユーザー ID を格納できます。

次に、User クラスで、関連付けを Note クラスに追加します。これは 1 対多の関連付けであり、Datamapperhas 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 に答える