别担心,你没有被卡住。
我认为您最好的选择是覆盖 Devise 的会话控制器并更改会话的“新”和“创建”方法。
所以在你自己的“sessions_controller.rb”中,你会有这样的东西:
class SessionsController < Devise::SessionsController
# GET /resource/sign_in
def new
resource = build_resource(nil, :unsafe => true)
clean_up_passwords(resource)
respond_with(resource, serialize_options(resource))
end
# POST /resource/sign_in
def create
resource = warden.authenticate!(auth_options)
set_flash_message(:notice, :signed_in) if is_navigational_format?
sign_in(resource_name, resource)
respond_with resource, :location => after_sign_in_path_for(resource)
end
end
在你的路线中,你会使用类似的东西(取决于你命名你的用户模型):
devise_for :users, :controllers => {
:sessions => 'sessions'
}
devise_for :businesses, :controllers => {
:sessions => 'sessions'
}
上面的会话控制器根本没有定制。我不知道你的代码,所以我真的无能为力。但基本步骤是:
- 检查
auth_options
和resource_name
变量以了解它们如何存储数据。
resource
如果在用户表中未找到,请添加条件逻辑以更改这些变量。
设计很棒,角色也很棒,但有时只有一个用户模型,甚至使用 STI,都没有意义。因为我在最近的一个项目中处理过这个问题,所以我很快就会就这个确切的问题写一篇更长的文章。