rails应用程序如何邀请您的朋友自定义网址?

时间:2014-03-25 03:36:37

标签: ruby-on-rails facebook twitter devise omniauth

我目前正在使用devise_invitable提交邀请新用户的电子邮件。您发送的每封电子邮件都会创建唯一令牌,如果他们接受邀请,则会连接这两个用户。我想要做的是让每个current_user都有一个保持不变的唯一邀请令牌,以便他们可以通过推特发送,发送电子邮件等等,以及通过点击链接接受邀请的任何人(www.mydomain.com/signup) /'unique_current_user_token')将被带到注册表单,该表单将令牌存储在他们的“帐户”中,以便我可以看到谁邀请了他们。是吗?

2 个答案:

答案 0 :(得分:3)

您可能希望通过覆盖设计的注册页面并允许我们的新参数到模型(attr_accessible rails 3或params.require(:foo).permit)来手动执行此操作。

首先你应该删除设计,因为你不会使用它来搜索这个方法,并且没有找到一个干净的方法来使用devise_invitable。

第2步: 将属性添加到名为invitation_token的users表中(这个与设计不同,因为每个用户都是唯一的,并且将用于发送接收邀请时未使用的邀请)

并添加到用户模型(根据rails casts

before_create :generate_invitation_token
def generate_invitation_token
  self.invitation_token = Digest::SHA1.hexdigest([Time.now, rand].join)
end 

由此每个用户都将拥有一个唯一的invitation_token

第3步:现在您可以使用/ signup /:invitation_token这样的网址来邀请每个用户唯一的用户(您应该将其添加到路由并将其映射到Devise :: RegistrationsController #创建)

第4步:接受用户并识别谁在注册时邀请他们

现在我们必须覆盖Devise::RegistrationsController#create and newview

在新的你应该找到邀请的用户。并添加一个应该引用该用户的虚拟属性,即:inviter.id

并在注册表单中添加hidden_​​field以设置此类属性

现在,在创建检查该属性的可用性(如果存在)时,您可以执行任何操作(在您的情况下添加用户之间的关系)。

这就是我认为 如果您需要其他任何评论,我会编辑我的答案以帮助您更多

答案 1 :(得分:1)

我会添加一个更详细的步骤,就像有人像我一样努力从@khaled_gomaa实施解决方案,这很好。

1a。如果您要覆盖设计注册控制器,请将其添加到此控制器:

before_filter :configure_permitted_parameters

protected
def configure_permitted_parameters
  devise_parameter_sanitizer.for(:sign_up) << :invited_by
end

1b。如果您使用自定义控制器,请将以下内容添加到应用程序控制器:

before_action :configure_permitted_parameters, if: :devise_controller?

protected

def configure_permitted_parameters
  devise_parameter_sanitizer.for(:sign_up) << :username
end

2. 在您的控制台中运行:

rails generate migration AddInvitationTokenToUsers invitation_token:string invited_by:integer

我不确定它是否在原始说明中,但我认为设置邀请用户的用户非常有用。

编辑用户模型并添加以下行:

before_create :generate_invitation_token
def generate_invitation_token
  self.invitation_token = Digest::SHA1.hexdigest([Time.now, rand].join)
end

3. 我没有在config / routes.rb中设置额外路由

4。这对我来说更加困惑。不确定我是否没有完全遵循原始说明,但它在rails 4中运行良好。

如果你没有覆盖登记委托人,你将需要它,所以我的1a步骤是愚蠢的......

在名为registrations_controller.rb的控制器文件夹下添加一个新文件,其中包含以下内容:

class RegistrationsController < Devise::RegistrationsController
  before_filter :configure_permitted_parameters
  def new
    if params.has_key?(:invitation_token)
      inviter = User.where(:invitation_token => params[:invitation_token]).first
      @invited_by = inviter.id     
    end
    super
  end

  def create    
    super
    if resource.save && params[:user].has_key?(:invited_by)
      resource.invited_by = params[:user][:invited_by]
      resource.save
    end
  end

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) << :invited_by
  end
end

在新方法中,我们为sign_up表单设置额外字段。我们正在使用来自param的令牌恢复邀请者(谁邀请)的id。

Creates方法将用户保存在db中。在此之前,我们将从表单中获取隐藏字段并将其添加给用户,以防用户来自邀请。

在view.html.erb(或您正在使用的任何内容)中,在表单内添加以下行:

<%= f.hidden_field :invited_by, :value => @invited_by %>

就是这样。运行迁移以添加新列。只需转到http://example.org/users/sign_up?invitation_token=USER_TOKEN