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