0

データベースにアクセスするために ActiveRecord を使い始めましたが、非常に便利です。ただし、ActiveRecord::Relationオブジェクト内のデータにアクセスするのは難しいようです。次を使用してデータベースにクエリを実行します。

post '/login' do
    session.clear
    r = User.where(:username => params["user"], :password => Digest::MD5.hexdigest(params["pass"]))
    if r.count == 1 
        session[:user] = r
        session[:user].delete(:password)
        status 200
    else
        status 401
    end
end 

返されたデータを使用して、Ruby は 1 つの行があることを確認し、1 つの行がある場合は、rオブジェクトの内容を hashに設定しますsession[:user]。次に、理想的には、session[:user]オブジェクトからパスワード データを削除して、ユーザーを識別するための詳細のみを提供する必要があります。ただし、このコードを使用wrong number of arguments (1 for 0)すると、行を指しているというエラーが発生します.delete。では、このオブジェクトからパスワード データを削除したり、ハッシュに変換したりするにはどうすればよいでしょうか。ハッシュ形式のパスワードを削除できることはわかっています。

4

3 に答える 3

0

ユーザーの再識別に関しては、私は通常、session簡単に改ざんできない単一の一意の属性のみをオブジェクトに保存します (Rails では、セッションは署名付きで暗号化された Cookie に保存されます)。データの量は、通常、保存されたセッションに制限されています。

この目的のために、ユーザーがログインしてセッションに保存されるたびtokenに再生成されるユーザー テーブルに を追加します。通常 (PostgreSQL では) type のこの列を定義しますが、a などを使用することもできます。uuidVARCHAR(128)

ユーザーが戻ってきた場合は、

@current_user = User.where(token: session['user_token']).first

ユーザーがログアウトすると、ユーザーのtoken:

@current_user.update_attribute :token, nil
session.clear
于 2013-06-02T16:42:10.883 に答える
0

ActiveRecord クエリは、配列やオブジェクトではなくリレーションをselect返しますcollectsession[:user] = User.all.select{|u| u.id == 1}

したがって、上記のように:

User.where(:id => 1).class == ActiveRecord::Relation 

その間

User.find(1).class == User

これは、クエリを連鎖させたときに、ActiveRecord がそれらを 1 つの SQL クエリに変換できるようにするためです。非常に多くのレコードを取得して Ruby オブジェクトに変換し、それらに対して Ruby コマンドを実行する必要はありません。

非常に単純な例:

$ User.where(:id => 1).count
   (0.5ms)  SELECT COUNT(*) FROM "users" WHERE "users"."id" = 1
=> 1

対:

$ User.where(:id => 1).all.count
  User Load (0.6ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1
=> 1

これ.allにより、ActiveRecord::Relation が Ruby オブジェクトの配列に変換されます。この場合は、User

それからあなたはすることができます

User.find(1).update_attributes(:name => "Joseph")

user = User.find(1)
user.name = "Jack"
user.save

それはRubyオブジェクトだからです。

于 2013-06-02T21:14:59.260 に答える
0

ハッシュやユーザーではなく、リレーションで削除を呼び出しています。

@sunny1304 が言ったように、データベースから取得するフィールドを選択できます。また、#first を呼び出して 1 つのエントリのみを取得する必要があります。

r = User.where(:username => params["user"], :password => Digest::MD5.hexdigest(params["pass"])).select(:id, :username, :other_attrs).first

とにかく、すべてのユーザーデータをセッションに保存しないでください。ID のみを保存する必要があり、おそらく変更されないもの (アプリに存在する場合はユーザー名など) を保存する必要があります。そして、リクエストごとにユーザーデータをクエリします。

于 2013-06-02T16:26:22.527 に答える