【问题标题】:How do rails app have invite your friends custom url?rails 应用程序如何邀请您的朋友自定义 url?
【发布时间】:2014-05-02 17:31:07
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    首先,您应该删除 devise invitable,因为您不会将它用于我搜索过的这种方法,并且没有找到使用 devise_invitable 的干净方法。

    第 2 步: 向名为invitation_token 的用户表添加属性(此属性与设计邀请不同,因为这将是每个用户唯一的,用于发送未使用的邀请)

    并添加到用户模型中(根据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 之类的 url 来邀请每个用户唯一的用户(您应该将其添加到路由并将其映射到 Devise::RegistrationsController #创建)

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

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

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

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

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

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

    【讨论】:

    • 谢谢!听起来这正是我正在寻找的东西
    • 如果您遇到任何问题评论要求澄清。如果可以,请标记它以供其他搜索它的人使用
    • 那么我必须遵循 railscast 中的所有步骤吗?
    • 现在我只是参考。它做的事情与你想要的完全相似
    • 作为一个快速说明——Rails 5 正在引入一种 generating secure tokens 的方法,它可以通过在设计模型中使用 has_secure_token :invitation_token 来替换答案中详述的令牌生成。
    【解决方案2】:

    我将添加更详细的步骤,如果有人像我一样努力实施@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
    

    在新方法中,我们为注册表单设置了额外的字段。我们正在使用来自参数的令牌恢复邀请者(邀请者)的 ID。

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

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

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

    就是这样。运行迁移以添加新列。直接去http://example.org/users/sign_up?invitation_token=USER_TOKEN

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-26
      • 2015-07-29
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-02
      • 2011-12-30
      相关资源
      最近更新 更多