我正在创建一个Rails应用程序,用户可以通过选中表单中的“人”或“组织”来注册。我正在努力找到一种方法将其实现到Rails中。这两种用户类型都具有相同的授权。我不知道我是否想在我的ActiveRecord数据库中使用字符串或布尔值作为数据类型。另外,我需要在我的模型(User.rb)和我的控制器中放置什么才能验证它并分别实现它?
答案 0 :(得分:2)
有很多方法可以实现这一点;这取决于你的需求。问问自己:“人和组织是否共享相同的属性?”
如果他们这样做,唯一能区分两者的是角色(或任何你想称之为的角色),即个人或组织。对于那种情况,Rails 4.1 provides AR enums。这是最简单的解决方案,它可能是这样的:
class User < ActiveRecord::Base
enum role: [ :person, :organization ] # @user.role => 'person', @user.person? => true
end
另一方面,如果人员和组织只共享某些属性,您可以考虑使用polymorphic association(如果人员和组织不共享任何属性 - 甚至不是role
- 他们应该是两个不同的模型)。基本模型应包含人员和组织共享的属性。人员/组织模型应包含特定于该模型的属性。
# common attributes
class User < ActiveRecord::Base
belongs_to :profile, polymorphic: true
def self.roles
%w(person organization)
end
end
# person-specific attributes
class PersonProfile < ActiveRecord::Base
has_one :user, as: :profile, dependent: :destroy
end
# organization-specific attributes
class OrganizationProfile < ActiveRecord::Base
has_one :user, as: :profile, dependent: :destroy
end
对于用户注册,您可以创建users#new
和users#create
操作。在您的用户注册表单(可能是app/views/users/new.html.erb
)中,您可以使用select_tag
让用户指定其角色。然后,使用它来确定要附加到用户模型的配置文件类型。例如(users#create
):
def create
@user = User.new(user_params)
if role = params[:role]
# return HTTP 400
head :bad_request and return unless User.roles.include?(role)
# Assign the User's profile
@user.profile = "#{role.capitalize}Profile".constantize.new
else
# enter your own logic here
end
@user.save ? redirect_to(@user) : render(:new)
end
我认为会话的处理(用户登录/注销)应该在单独的SessionsController
处理。
答案 1 :(得分:0)
将新表添加到名为user_types
的数据库中,其中包含字段role
和id
。在users
表格中,您需要添加user_type_id
列。然后,在UserType
模型中
class UserType < ActiveRecord::Base
has_many :users
end
在User
模型中,您需要添加
class User < ActiveRecord::Base
belongs_to :user_type
end
您可以在种子中创建UserType记录,但要确保每次重置数据库时都会运行,将其添加到seeds.rb
UserType.create!(role: "person")
UserType.create!(role: "organization")
希望这是有道理的!
答案 2 :(得分:0)
如果您的问题中只有两种类型的用户(人员和组织),您可以拥有一个Person模型,并为其添加一个bool字段is_organization
。有关更多详细信息,请参阅设计(一种流行的身份验证gem)如何处理此here(此方法是链接页面上的选项2,您还可以查看选项1,即创建一个完整的新模型)。 / p>