Настройка ссылки друзей друзей

Я пытаюсь создать функцию, в которой вы можете пригласить своих друзей с URL-адресом клиента. Я добавил колонку в мою модель пользователя, чтобы, когда пользователь подписывается, он даст им уникальный токен, который будет отслеживать их, когда ссылка будет доступна.

User.rb:

def set_referer_url
 begin
 self.referer_url = rand(36**8).to_s(36)
 end while User.exists?(:referer_url => self.referer_url)
end

Затем я настроил почтовую программу, которая отправит друзьям приглашение со следующим URL:

www.nameofsite.com/r/[referer_url]

Я установил маршрут следующим образом:

match '/r/:referer_token' => 'users#new'

У меня есть столбец в моей модели пользователя, называемый referer, где я хочу записать, если пользователь зарегистрировался через ссылку на приглашение. Если это так, столбец-референт должен указать идентификатор пользователя лица, которое их направило.

Для представления sign_up у меня есть следующее:

<%= form_for @user, :as => :user, :url => {:controller => "users", :action => "create" } do |f| %>
 <%= f.hidden_field :referer_token %>

 <p><code>
 <%= f.label :email %>
 <%= f.text_field :email %>
 ...
</code> </p><p> В моей модели пользователя у меня есть следующее, чтобы попытаться присвоить идентификатор референта новому пользователю:</p> <pre class="prettyprint linenums">def referer_token
 User.referer_url if user
end

def referer_token=(token)
 self.referer = User.find_by_referer_url(token).id
end

А ТАКЖЕ

attr_accessible :email, :password, :password_confirmation, :referer_token

Я думал, что это найдет идентификатор референта по URL-адресу и установит его в столбце referer для нового пользователя. Кажется, это не происходит. Я не думаю, что параметр referer_token проходит через форму, так что идентификатор референта может быть сохранен. Как я могу это исправить?

1 ответ

Вы близки, но я, вероятно, сделаю ассоциацию в контроллере и определю ассоциацию в модели:

# models/user
class User < ActiveRecord::Base
 belongs_to :referrer, :class_name => 'User'
 # you'll need a referrer_id on your users table
end

# views/users/new
<%= form_for(@user) do |f| %>
 <%= hidden_field_tag :referrer_token, params[:referrer_token] %>
 ...

# controllers/users_controller
class UsersController < ApplicationController
 @user = User.new(params[:user])
 @user.referrer = User.find_by_referrer_url(params[:referrer_token])
 @user.save
end

Тогда вы можете сделать:

@user.referrer => #

licensed under cc by-sa 3.0 with attribution.