サインアップ時にベータ版の招待者に従ってください

概要

このチュートリアルに従って、ベータ版招待システムを作成しました。 http://railscasts.com/episodes/124-beta-invitations。ユーザーは Rails アプリで相互にフォローすることもできます。

サインアップ時に招待者を招待した人をフォローさせるにはどうすればよいですか?

現在、メソッドを使用してユーザーモデルでこれを確立しようとしていますが、招待者がsender_id/user_idを介して招待者をフォローできるようにするメソッドを作成するのに苦労しています。

これは私がこれまでに使用したコードです。

スキーマ

  create_table "users", :force => true do |t|
    t.string   "name"
    t.string   "email"
    t.integer  "invitation_id"
    t.integer  "invitation_limit"
    t.timestamp "created_at",                                :null => false
    t.timestamp "updated_at",                                :null => false
    t.string    "password_reset_token"
    t.timestamp "password_reset_sent_at"
  end

  create_table "invitations", :force => true do |t|
    t.integer  "sender_id"
    t.string   "recipient_email"
    t.string   "token"
    t.datetime "sent_at"
    t.datetime "created_at",      :null => false
    t.datetime "updated_at",      :null => false
  end

モデル

ユーザー

class User < ActiveRecord::Base
  attr_accessible :name, :email, :password, :password_confirmation, :invitation_token

  has_many :relationships, foreign_key: "follower_id", dependent: :destroy
  has_many :followed_users, through: :relationships, source: :followed

  has_many :reverse_relationships, foreign_key: "followed_id",
                               class_name:  "Relationship",
                               dependent:   :destroy
  has_many :followers, through: :reverse_relationships, source: :follower

  has_many :sent_invitations, :class_name => 'Invitations', :foreign_key => 'sender_id'

  belongs_to :invitation

  after_create :follow_inviter      #---------- HERE!!

  def follow_inviter                #---------- HERE!!
    inviters = Invitation.find_by_sender_id
    inviters.each do |invite|
      self.follow!(invite)
    end
  end

  def invitation_token
    invitation.token if invitation
  end

  def invitation_token=(token)
    self.invitation = Invitation.find_by_token(token)
  end

  def following?(other_user)
    relationships.find_by_followed_id(other_user.id)
  end

 def follow!(other_user)
    relationships.create!(followed_id: other_user.id)
  end

  def unfollow!(other_user)
    relationships.find_by_followed_id(other_user.id).destroy
  end

end

人間関係

class Relationship < ActiveRecord::Base

  attr_accessible :followed_id

  belongs_to :follower, class_name: "User"
  belongs_to :followed, class_name: "User"

  validates :follower_id, presence: true
  validates :followed_id, presence: true
end

招待

class Invitation < ActiveRecord::Base
  attr_accessible :recipient_email, :sender_id, :sent_at, :token

  belongs_to :sender, :class_name => "User"
  has_one :recipient, :class_name => "User"

  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

  before_create :generate_token

  private

    def generate_token
      self.token = Digest::SHA1.hexdigest([Time.now, rand].join)
    end

end

解決策

これは機能するはずです。

def follow_inviter
  if invitation = Invitation.find_by_recipient_email(email)
    follow!(invitation.sender)
  end
end

しかし、モデルの関連付けは明確に定義されていません。たとえば、招待状の has_one :recipient, :class_name => “User” は、テーブルに受信者 ID があることを期待していますが、実際にはありません。それを見直したほうがいいよ。