したがって、これらの質問がどれほど初心者に見えるかについてお詫び申し上げます。私はレールに不慣れで、最初のタスクとしてNeo4Jも導入しました。プロジェクトを成長させるのに最適だと思われたからです。
アクションの流れを説明してから、サンプルコードを示します。現在、ステップ 3-5 に追加しようとしています。
- ユーザーは FB 経由でログインします
- 最初のログインでユーザー ノードが作成されます。ユーザーが存在する場合、そのユーザー+ノードを取得するだけです
- ユーザー ノードが作成された後、koala gem を使用して FB グラフ API にアクセスします。
- アプリを使用している各フレンドのフレンドリストを取得します。
- 各フレンドを調べて、2 人のユーザー間の双方向のフレンドシップ関係を追加します。
3-5 はユーザーが最初に参加したときにのみ発生する必要があるため、コールバックに関連付けられたメソッドでこれを実行できると考えましたafter_save
。ただし、ある時点で追加の属性を使用してユーザーを更新する必要があり、after_save が再度呼び出されるため、このロジックには欠陥があります。更新でこれを防ぐことはできますか?
参照用のSessionsController
def create
user = User.from_omniauth(env["omniauth.auth"])
session[:user_id] = user.id
redirect_to root_url
end
def destroy
session.delete(:user_id)
redirect_to root_path
end
したがって、私のuser.rbには次のようなものがあります
has_many :both, :friendships
after_save :check_friends
def self.from_omniauth(auth)
@user = User.where(auth.slice(:provider, :uid)).first
unless @user
@user = User.new
# assign a bunch of attributes to @user
@user.save!
end
return @user
end
def facebook
@facebook ||= Koala::Facebook::API.new(oauth_token)
block_given? ? yield(@facebook) : @facebook
rescue Koala::Facebook::APIError => e
logger.info e.to_s
nil
end
def friends_count
facebook { |fb| fb.get_connection("me", "friends", summary: {}) }
end
def check_friends(friendships)
facebook.get_connection("me", "friends").each do |friend|
friend_id = friend["id"]
friend_node = User.where(friend_id)
Friendship.create_friendship(user,friend_node)
return true
end
end
友情.rb
from_class User
to_class User
type 'friendship'
def self.create_friendship(user,friend_node)
friendship = Friendship.create(from_node: user, to_node: friend_node)
end
リレーションシップ ノードの作成方法が正しいかどうかはわかりません。作成したばかり@user
のように、それをメソッドに組み込みcheck_friends
、ユーザー ノードとフレンド ノードを適切に取得して、2 つをリンクできるようにするにはどうすればよいでしょうか。
現時点では、user と friend_user がノードであることを認識していません。
他の悪いコード プラクティスを見つけた場合は、お知らせください。
事前に: @subvertallchris の助けに感謝します。このような私の多くの質問にあなたが答えてくれると確信しています。