How to make Users automatically Follow Admin User on Sign Up

强颜欢笑 提交于 2019-11-29 10:29:31

问题


Currently I allow users to follow one another on my rails app (similar to twitter).

I would love if New Users that sign up to the site Automatically follow Admin User.

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

Below is the code I use to create new users and allow users to follow one another.(i know this is a very broad question but .....)

(Can someone please point me in the right direction onto how I can get this started. Would I need to create a method....in my models or add code to the controller?)

New to Rails Please help)... :)

USER CONTROLLER

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

MODELS

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

I used this tutorial to help me establish privileged administrative users with a boolean admin attribute in the User model

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

SCHEMA

  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

Would I need to create a Method that defines user_admin?


回答1:


In user.rb add a after_create filter

after_create :follow_admin!

def follow_admin!
  relationships.create!(followed_id: admin_user.id)
end



回答2:


In create action before sign_in add

@user.follow! admin_user

you need to fetch admin user first somehow. Good idea would be to make follow!, following? and unfollow! methods to accept either id or object as in

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


来源:https://stackoverflow.com/questions/17758961/how-to-make-users-automatically-follow-admin-user-on-sign-up

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!