0

目前,我允许用户在我的 rails 应用程序(类似于 twitter)上互相关注。

如果注册该站点的新用户自动关注管理员用户,我会很高兴。

Similar to how MySpace use to automatically make Tom your first friend

下面是我用来创建新用户并允许用户互相关注的代码。(我知道这是一个非常广泛的问题,但是.....)

(有人可以指出我如何开始的正确方向。我需要在我的模型中创建一个方法......还是向控制器添加代码?)

Rails 新手请帮忙)... :)

用户控制器

class UsersController < ApplicationController
  before_filter :admin_user,     only: [:destroy]

  respond_to :html, :js

  def new
    @user = RegularUser.new
  end

  def index
    @users = User.paginate(page: params[:page], :per_page => 100).search(params[:search])
  end

  def destroy
    User.find_by_username(params[:id]).destroy
    flash[:success] = "User destroyed."
    redirect_to users_url
  end

  def create
    @user = RegularUser.new(params[:regular_user])
    if @user.save
      UserMailer.registration_confirmation(@user).deliver
      UserMailer.welcome_user(@user).deliver
      sign_in @user
      flash[:success] = "Welcome to the ClickOnComics!"
      redirect_to (publishers_path)
    else
      render 'new'
    end
  end

  private

    def admin_user
      redirect_to(root_path) unless current_user.admin?
    end

    def follow_admins
      admins = User.find_by_admin(true)
      admins.each do |admin|
      self.follow!(admin)
    end
end

class RelationshipsController < ApplicationController
  before_filter :current_user

  respond_to :html, :js

 def create
   @user = User.find(params[:relationship][:followed_id])
    current_user.follow!(@user)
   respond_with @user
 end

  def destroy
    @user = Relationship.find(params[:id]).followed
    current_user.unfollow!(@user)
    respond_with @user
  end

end

楷模

class Relationship < ActiveRecord::Base

  attr_accessible :followed_id

  belongs_to :follower, class_name: "User"
  belongs_to :followed, class_name: "User"

  validates :follower_id, presence: true
  validates :followed_id, presence: true
end

class User < ActiveRecord::Base
  attr_accessible :name, :email, :password, :password_confirmation

  has_many :relationships, foreign_key: "follower_id", dependent: :destroy
  has_many :followed_users, through: :relationships, source: :followed

  has_many :reverse_relationships, foreign_key: "followed_id",
                               class_name:  "Relationship",
                               dependent:   :destroy
  has_many :followers, through: :reverse_relationships, source: :follower

  after_create :follow_admins

  def follow_admins
    admins = User.find_all_by_admin(true)
      admins.each do |admin|
      self.follow!(admin)
    end
  end

  def following?(other_user)
    relationships.find_by_followed_id(other_user.id)
  end

  def follow!(other_user)
    relationships.create!(followed_id: other_user.id)
  end

  def unfollow!(other_user)
    relationships.find_by_followed_id(other_user.id).destroy
  end

end

我使用本教程帮助我在 User 模型中建立具有布尔管理属性的特权管理用户

http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-users#sec-administrative_users

架构

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

我需要创建一个定义 user_admin 的方法吗?

4

2 回答 2

1

在添加create之前的行动sign_in

@user.follow! admin_user

您需要先以某种方式获取管理员用户。好主意是 makefollow!和接受 id 或 object 的方法,following?unfollow!

def follow!(user_or_id)
  id = (user_or_id.is_a?(User) ? user_or_id.id : user_or_id)
  relationships.create!(followed_id: id)
end
于 2013-07-20T05:30:43.397 回答
1

在 user.rb 添加一个 after_create 过滤器

after_create :follow_admin!

def follow_admin!
  relationships.create!(followed_id: admin_user.id)
end
于 2013-07-20T13:09:12.453 回答