如何将新用户的电子邮件互联网域与我网站上的网络相关联? (铁轨3)

时间:2013-05-18 21:24:53

标签: ruby-on-rails ruby ruby-on-rails-3

例如,如果用户使用电子邮件johndoe@xyz.com注册,我希望此用户成为我网站上“XYZ”网络的一部分。人们将被允许加入他们各自的网络。我的网站上会有很多网络,它们彼此是分开的。这是用户表在schema.db中的外观。

create_table "activities", :force => true do |t|
    t.integer  "trackable_id"
    t.string   "trackable_type"
    t.integer  "owner_id"
    t.string   "owner_type"
    t.string   "key"
    t.text     "parameters"
    t.integer  "recipient_id"
    t.string   "recipient_type"
    t.datetime "created_at",     :null => false
    t.datetime "updated_at",     :null => false
  end

  add_index "activities", ["owner_id", "owner_type"], :name => "index_activities_on_owner_id_and_owner_type"
  add_index "activities", ["recipient_id", "recipient_type"], :name => "index_activities_on_recipient_id_and_recipient_type"
  add_index "activities", ["trackable_id", "trackable_type"], :name => "index_activities_on_trackable_id_and_trackable_type"



  create_table "users", :force => true do |t|
    t.string    "name"
    t.string    "email"
    t.timestamp "created_at",                         :null => false
    t.timestamp "updated_at",                         :null => false
    t.string    "password_digest"
    t.string    "remember_token"
    t.boolean   "admin",           :default => false
  end

我正在使用活动来跟踪用户模型,并将其显示在“Feed”中。我想在视图中添加这样的内容:“用户名已加入XYZ网络。”通过跟踪用户模型。

1 个答案:

答案 0 :(得分:0)

创建Network模型。它的数据库表将包含一个名为domain的字符串。一个网络将拥有许多用户;用户将属于网络。也可以在用户模型中添加network_id字符串。

关联和支持方法应如下所示:

class Network < ActiveRecord::Base
  has_many :users

  def peers
    self.users
  end

end

class User < ActiveRecord::Base
  belongs_to :network
  delegate :peers => :network

  validates :network_id, :presence => true
  # ...
end

现在这是可能的:

@network.users
# => collection of all users in a network

@user.network
# => the network user belongs to

@user.peers
# => collection of all users within @user's network
# => note: this will include @user itself in the collection

当用户注册时,创建或查找包含从用户电子邮件地址中提取的域字符串的Network记录。当用户更新其电子邮件地址时,请检查域是否已更改,然后重新创建或重新查找具有匹配域的Network记录。

在模型中自动执行此功能很有吸引力,但在控制器中正确实现,特别是UsersController#createUsersController#update

def create
  # ...isntantiate @user...
  #
  set_network_id_from_email(@user.email)
  #
  # ...save...
end

def update
  # ...instantiate @user...
  #
  if @user.email != params[:user][:email]  
    set_network_id_from_email(params[:user][:email])
  end
  #
  # ...update_attributes...
end

private

def set_network_id_from_email(addr)
  if email = Mail::Address.new(addr)
    @user.network_id = Network.find_or_create_by_domain(email.domain)
  end
end