创建两种类型的用户 Rails 应用
Creating two types of users Rails app
我正在创建一个 rails 应用程序,它有两种类型的用户:司机和机械师。
到目前为止,我已经为司机 class(称为 "users")完全设置了配置文件和属性,并连接了 "cars" 模型,以便他们可以将汽车添加到他们的配置文件中。
现在我需要创建 "mechanic" 用户,就像一个商业页面,包含地址、提供的服务等,然后这些机械师将添加司机作为他们的客户。
我的直觉是创建一个新的机制模型并以与用户模型相同的方式设置它,但使用适当的模式。我想我可能 运行 会遇到 sessions helper
的问题,因为 "user" 在很多函数中使用。我可以在会话助手中复制这些项目,并将 "user" 替换为 "mechanic",但我不确定这是否可行。
我考虑过使用 gem 之类的 cancancan 来限制用户,但这似乎有问题。还想知道我是否可以使用当前的 "User" class 并创建两个从 User 继承的模型(驱动程序和机制),每个模型都有特定的功能。
我真的需要知道从哪个方向开始才能实现这一点,所以任何建议、有用的 rails 演员表链接等都会很棒。谢谢!
会话助手
module SessionsHelper
# Logs in the given user.
def log_in(user)
session[:user_id] = user.id
end
# Remembers a user in a persistent session.
def remember(user)
user.remember
cookies.permanent.signed[:user_id] = user.id
cookies.permanent[:remember_token] = user.remember_token
end
def current_user?(user)
user == current_user
end
# Returns the user corresponding to the remember token cookie.
def current_user
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: user_id)
elsif (user_id = cookies.signed[:user_id])
user = User.find_by(id: user_id)
if user && user.authenticated?(cookies[:remember_token])
log_in user
@current_user = user
end
end
end
# Returns true if the user is logged in, false otherwise.
def logged_in?
!current_user.nil?
end
def forget(user)
user.forget
cookies.delete(:user_id)
cookies.delete(:remember_token)
end
# Logs out the current user.
def log_out
forget(current_user)
session.delete(:user_id)
@current_user = nil
end
# Redirects to stored location (or to the default).
def redirect_back_or(default)
redirect_to(root_url)
session.delete(:forwarding_url)
end
# Stores the URL trying to be accessed.
def store_location
session[:forwarding_url] = request.url if request.get?
end
end
user.rb
class User < ActiveRecord::Base
has_many :cars
attr_accessor :remember_token
before_save { self.email = email.downcase }
validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, length: { maximum: 255 },
format: { with: VALID_EMAIL_REGEX },
uniqueness: { case_sensitive: false }
has_secure_password
validates :phone, presence:true
validates :password, length: { minimum: 6 }, allow_blank: true
# Returns the hash digest of the given string.
def User.digest(string)
cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
BCrypt::Engine.cost
BCrypt::Password.create(string, cost: cost)
end
# Returns a random token.
def User.new_token
SecureRandom.urlsafe_base64
end
# Remembers a user in the database for use in persistent sessions.
def remember
self.remember_token = User.new_token
update_attribute(:remember_digest, User.digest(remember_token))
end
# Returns true if the given token matches the digest.
def authenticated?(remember_token)
return false if remember_digest.nil?
BCrypt::Password.new(remember_digest).is_password?(remember_token)
end
def forget
update_attribute(:remember_digest, nil)
end
def feed
Car.where("user_id = ?", id)
end
end
cookies.permanent.signed[:user_id] = user.id
cookies.permanent[:remember_token] = user.remember_token
end
def current_user?(user)
user == current_user
end
# Returns the user corresponding to the remember token cookie.
def current_user
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: user_id)
elsif (user_id = cookies.signed[:user_id])
user = User.find_by(id: user_id)
if user && user.authenticated?(cookies[:remember_token])
log_in user
@current_user = user
end
end
end
# Returns true if the user is logged in, false otherwise.
def logged_in?
!current_user.nil?
end
def forget(user)
user.forget
cookies.delete(:user_id)
cookies.delete(:remember_token)
end
# Logs out the current user.
def log_out
forget(current_user)
session.delete(:user_id)
@current_user = nil
end
# Redirects to stored location (or to the default).
def redirect_back_or(default)
redirect_to(root_url)
session.delete(:forwarding_url)
end
# Stores the URL trying to be accessed.
def store_location
session[:forwarding_url] = request.url if request.get?
end
end
使用康康 gem ..您可以在 railscasts.com
中找到它的一集
我建议通过将身份验证与授权分开来稍微改变一下您的设置。 User、Driver 和 Mechanic 是独立但相关的概念。用户是可以访问您的应用程序机制的任何人,而驱动程序是分配给用户的角色(他们有权执行的操作)。
有多种不同的方法可以解决这个问题,并且不知道您的应用程序的确切性质,因此很难提出特定的解决方案,但我认为如果您解决了这些问题,您会更好长 运行.
这里是 link 一个很好的资源,可以帮助您入门:
我认为,devise
gem 应该有所帮助。
查看入门部分 (https://github.com/plataformatec/devise/blob/master/README.md#getting-started),您可以在其中找到有关如何创建不同类型用户的信息。
希望对您有所帮助!
查看 Pundit gem:https://github.com/elabs/pundit 我在最近的项目中使用它并且喜欢它。
我正在创建一个 rails 应用程序,它有两种类型的用户:司机和机械师。
到目前为止,我已经为司机 class(称为 "users")完全设置了配置文件和属性,并连接了 "cars" 模型,以便他们可以将汽车添加到他们的配置文件中。
现在我需要创建 "mechanic" 用户,就像一个商业页面,包含地址、提供的服务等,然后这些机械师将添加司机作为他们的客户。
我的直觉是创建一个新的机制模型并以与用户模型相同的方式设置它,但使用适当的模式。我想我可能 运行 会遇到 sessions helper
的问题,因为 "user" 在很多函数中使用。我可以在会话助手中复制这些项目,并将 "user" 替换为 "mechanic",但我不确定这是否可行。
我考虑过使用 gem 之类的 cancancan 来限制用户,但这似乎有问题。还想知道我是否可以使用当前的 "User" class 并创建两个从 User 继承的模型(驱动程序和机制),每个模型都有特定的功能。
我真的需要知道从哪个方向开始才能实现这一点,所以任何建议、有用的 rails 演员表链接等都会很棒。谢谢!
会话助手
module SessionsHelper
# Logs in the given user.
def log_in(user)
session[:user_id] = user.id
end
# Remembers a user in a persistent session.
def remember(user)
user.remember
cookies.permanent.signed[:user_id] = user.id
cookies.permanent[:remember_token] = user.remember_token
end
def current_user?(user)
user == current_user
end
# Returns the user corresponding to the remember token cookie.
def current_user
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: user_id)
elsif (user_id = cookies.signed[:user_id])
user = User.find_by(id: user_id)
if user && user.authenticated?(cookies[:remember_token])
log_in user
@current_user = user
end
end
end
# Returns true if the user is logged in, false otherwise.
def logged_in?
!current_user.nil?
end
def forget(user)
user.forget
cookies.delete(:user_id)
cookies.delete(:remember_token)
end
# Logs out the current user.
def log_out
forget(current_user)
session.delete(:user_id)
@current_user = nil
end
# Redirects to stored location (or to the default).
def redirect_back_or(default)
redirect_to(root_url)
session.delete(:forwarding_url)
end
# Stores the URL trying to be accessed.
def store_location
session[:forwarding_url] = request.url if request.get?
end
end
user.rb
class User < ActiveRecord::Base
has_many :cars
attr_accessor :remember_token
before_save { self.email = email.downcase }
validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, length: { maximum: 255 },
format: { with: VALID_EMAIL_REGEX },
uniqueness: { case_sensitive: false }
has_secure_password
validates :phone, presence:true
validates :password, length: { minimum: 6 }, allow_blank: true
# Returns the hash digest of the given string.
def User.digest(string)
cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
BCrypt::Engine.cost
BCrypt::Password.create(string, cost: cost)
end
# Returns a random token.
def User.new_token
SecureRandom.urlsafe_base64
end
# Remembers a user in the database for use in persistent sessions.
def remember
self.remember_token = User.new_token
update_attribute(:remember_digest, User.digest(remember_token))
end
# Returns true if the given token matches the digest.
def authenticated?(remember_token)
return false if remember_digest.nil?
BCrypt::Password.new(remember_digest).is_password?(remember_token)
end
def forget
update_attribute(:remember_digest, nil)
end
def feed
Car.where("user_id = ?", id)
end
end
cookies.permanent.signed[:user_id] = user.id
cookies.permanent[:remember_token] = user.remember_token
end
def current_user?(user)
user == current_user
end
# Returns the user corresponding to the remember token cookie.
def current_user
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: user_id)
elsif (user_id = cookies.signed[:user_id])
user = User.find_by(id: user_id)
if user && user.authenticated?(cookies[:remember_token])
log_in user
@current_user = user
end
end
end
# Returns true if the user is logged in, false otherwise.
def logged_in?
!current_user.nil?
end
def forget(user)
user.forget
cookies.delete(:user_id)
cookies.delete(:remember_token)
end
# Logs out the current user.
def log_out
forget(current_user)
session.delete(:user_id)
@current_user = nil
end
# Redirects to stored location (or to the default).
def redirect_back_or(default)
redirect_to(root_url)
session.delete(:forwarding_url)
end
# Stores the URL trying to be accessed.
def store_location
session[:forwarding_url] = request.url if request.get?
end
end
使用康康 gem ..您可以在 railscasts.com
中找到它的一集我建议通过将身份验证与授权分开来稍微改变一下您的设置。 User、Driver 和 Mechanic 是独立但相关的概念。用户是可以访问您的应用程序机制的任何人,而驱动程序是分配给用户的角色(他们有权执行的操作)。
有多种不同的方法可以解决这个问题,并且不知道您的应用程序的确切性质,因此很难提出特定的解决方案,但我认为如果您解决了这些问题,您会更好长 运行.
这里是 link 一个很好的资源,可以帮助您入门:
我认为,devise
gem 应该有所帮助。
查看入门部分 (https://github.com/plataformatec/devise/blob/master/README.md#getting-started),您可以在其中找到有关如何创建不同类型用户的信息。
希望对您有所帮助!
查看 Pundit gem:https://github.com/elabs/pundit 我在最近的项目中使用它并且喜欢它。