我们有一个多帐篷导轨应用程序,非常类似于Ryan Bates解释/教导的“从头开始”的方法。
从头开始验证。
从头开始的多租户。
我们有一个具有子域属性的帐户模型,并使用范围来分隔数据。
#ApplicationController
around_filter :scope_current_account
private
def current_account
if request.subdomain.present? && request.subdomain != 'www' && request.subdomain != 'ndt-staging'
@account ||= Account.find_by_subdomain!(request.subdomain)
end
end
helper_method :current_account
def scope_current_account
if request.subdomain.present? && request.subdomain != 'www' && request.subdomain != 'ndt-staging'
Account.current_id = current_account.id
end
yield
ensure
Account.current_id = nil
end
模特:
#Account.rb
has_many :users, :inverse_of => :account, :dependent => :destroy
#User.rb
belongs_to :account, :inverse_of => :users
default_scope { where(account_id: Account.current_id) }
我的questino是:管理用户应用程序的最佳方式是什么..意思是User.scoped 和 User.unscoped?
首先想到的是向User模型添加admin_password属性。使用环境变量设置密码,并在创建用户/帐户时将管理员密码值添加到隐藏字段中。
(帐户新操作还会构建用户并创建用户帐户)
#AccountsController
def new
@account = Account.new
@account.users.build(params[:user])
end
我用这种方法看到的最大问题是身份验证。我需要重新编写内容,以便在admin_password正确时,不会检查正常的密码属性。如果admin_password不正确,将使用密码属性。
作为旁注,我看过像acts_as_tenant和devise这样的插件,但我宁愿自己构建这些部件。
我可能会走错路,这就是为什么我要求推荐的解决方案/想法。提前感谢您:)
#SessionsController
def create
user = User.find_by_email(params[:email].downcase)
if user && user.authenticate(params[:password])
sign_in user
redirect_to welcome_path
else
flash.now[:error] = 'Invalid email/password combination' # Not quite right!
render 'new'
end
end
答案 0 :(得分:1)
我使用cancan gem解决了这个问题,并在帐户创建操作中创建了管理员用户。