2013-09-14 4 views
0

Я создал Приглашающая система BETA, следуя этому руководству. http://railscasts.com/episodes/124-beta-invitations. Пользователи также могут следовать друг за другом в моем приложении Rails.Следуйте за BETA Inviter on Sign Up

Как я могу пригласить человека, который пригласил его на регистрацию?

В настоящее время я пытаюсь установить это в своей модели пользователя с помощью метода, но у меня возникла проблема с созданием метода, который позволяет приглашенному следовать за Inviter через 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 

МОДЕЛИ

USER

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+\-.][email protected][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 

ответ

1

Это должно сработать.

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

Но ваши ассоциации моделей не определены.Например, has_one :recipient, :class_name => "User" в Invitation ожидает, что в таблице есть recipient_id, но это не так. Вы должны это рассмотреть.

1

Я мог бы быть неправильно, я младший рельсы разработчика, но, похоже, где у вас есть inviters = Invitation.find_by_sender_id вы должны иметь что-то вроде этого inviters = Invitation.find_by_sender_id(id_of_sender) где id_of_sender это идентификатор пользователя, отправившего приглашение ,

find_by_sender_id принимает 1 аргумент (идентификатор отправителя, который должен быть найден), и именно поэтому вы получаете ошибку wrong number of arguments (0 for 1).

Кроме того, для чего это стоит, я уверен, что методы find_by_*_id, где * - модель в вашей базе данных, устарели. Rails 4 использует что-то вроде Invitation.find(id_of_sender). Когда вы вызываете метод find в активной модели записи, он принимает идентификатор в качестве параметра.

Вы также можете использовать Invitation.find_by(email: '[email protected]'), чтобы найти записи на основе любого имущества, которое вы им предоставляете.

+0

как бы определить id_of_sender. В настоящее время я получаю undefined метод id_of_sender –

+0

'id_of_sender' будет просто идентификатором отправителя бета-приглашения. Так что у вас есть то, что хранится. Предположительно, 'user.id'. –

0

Извинение, если я недоразумение вашего вопроса ... У меня есть подобное требование, где один пользователь может пометить другой, как «любимый» пользователь (таблица т.е. пользователей имеет собственное отношение)

Для реализации этого, Я добавил таблицу с именем user_favorite так:

db\schema.rb

create_table "user_favorites", :id => false, :force => true do |t| 
    t.integer "user_id" 
    t.integer "favorite_user_id" 
    end 

    add_index "user_favorites", ["user_id"], :name => "index_user_favorites_on_user_id" 

app\models\user.rb

class User < ActiveRecord::Base 
    has_and_belongs_to_many  :favorite_users, :class_name => 'User', :join_table => "user_favorites", :foreign_key => "user_id", :association_foreign_key => "favorite_user_id" 

    def is_favorite?(user) 
    self.favorite_users.include?(user) 
    end 

    def toggle_favorite(favorite_user) 
    if favorite_user 
     if self.favorite_users.include?(favorite_user) 
     self.favorite_users.delete favorite_user 
     else 
     self.favorite_users << favorite_user 
     end 
    end 
    end 
end