我的应用有两个用户doctors
和hospitals
。医生可以查看案例并对其进行诊断,医院可以为医生创建诊断案例。这都是从他们自己的用户配置文件中完成的。
路线的设置方式如下:doctor_profile_path:转到医生的档案。 hospital_profile_path:去医院的个人资料。
我希望profile_path
重定向到用户的个人资料,无论他们拥有什么帐户。这样他们在医院时也无法前往doctor_profile_path
,路径名称也更简洁。我该怎么做?
其他问题:
的routes.rb。我尝试使用路径:'profile'但Rails只会找到第一个可用的匹配器,因此它不起作用
resource :doctor_profile, only: :do do
resources :plates, controller: 'doctor/cases', only: [:index, :show] do
post '/claim', action: 'claim'
end
end
resource :hospital_profile, only: :do do
resources :cases, controller: 'hospital/cases', only: [:new, :create]
end
控制器结构如下:
doctor/
-> cases_controller #=> contains the actions a doctor can do with a case
-> (things the doctor can do on his profile)
hospital
-> cases_controller #=> contains the actions a hospital can do with a case
-> (things a hospital can do on his profile)
profile_controller.rb
(这是How to create routes for 2 types of users accessing the same resource?)
的延续答案 0 :(得分:1)
def profile
@user = current_user
end
ProfilesController
中的
并添加routes
get '/profile' => 'profiles#profile'
将为您提供路径:profile_path
并与其建立链接<%= link_to 'profile', profile_path %>
现在,如果user
是doctor
或hospital
,您可能希望显示不同类型的信息
所以在views/profiles/profile.html.erb
你会做
<%= render partial: "#{@user.is_doctor? ? 'doctor' : 'hospital'}" %>
在app/views/profiles
1 _doctor.html.erb
2 _hostpital.html.erb
如果您有 user.profile_type 属性:
def is_doctor?
self.profile_type == 'doctor'
end
答案 1 :(得分:0)
您可能只需要一个用户模型,但角色不同(医生/医院)。您可以从以下地方开始:
它们都可以使用身份验证框架,例如devise。
<强>更新强>
我已经在聊天中回答了一些关联概念。在这里,我只是提供一个例子来解决你的问题。
您不需要“两种”用户模型,而是使用具有不同角色的单个用户模型,然后一切都变得简单。您所需要的只是处理用户,例如,单个用户登录页面和单个用户个人资料页面,并根据用户的角色显示不同的部分(如果需要)。这是一个例子:
您可能需要在用户模型中添加role
列以告知用户的角色(此处我只想简化示例),并为角色控件添加一些方法。(请参阅用户模型下面)。请注意,您应该在创建用户时分配角色。
class CreateUsers < ActiveRecord::Migration
def change
create_table(:users) do |t|
# ...
# NOTE: here is a simple example to implement a single role
# management(i.e., one role only for each users), if you
# need more complex management, please consider using
# a role management gem, such as rolify.
# role: 0 = normal user, 1 = doctor, 2 = hosiptal
t.integer :role, null: false, default: 0
# ...
end
end
end
但医生和医院的特定领域呢?我将创建另外两个模型 - DoctorInfo
和HospitalInfo
来存储这些字段以用于不同的角色,并创建用户模型的关联(属于)。如果用户的角色是医生,则用户只有一个doctor_info
,如果他/她的角色是医院,则有一个hospital_info
。
class CreateDoctorInfos < ActiveRecord::Migration
def change
create_table(:doctor_infos) do |t|
# ...
t.belongs_to :user
# ...
# columns for a doctor role only
# ...
end
end
end
class CreateHospitalInfos < ActiveRecord::Migration
def change
create_table(:hospital_infos) do |t|
# ...
t.belongs_to :user
# ...
# columns for a hospital role only
# ...
end
end
end
class User < ActiveRecord::Base
has_one: hospital_info
has_one: doctor_info
# ...
ROLE_MAP = {
normal_user: 0,
doctor: 1,
hospital: 2
}
validates :role, inclusion: { in: ROLE_MAP.values }
def is_a_role?(role_code)
(self.role == ROLE_MAP[role_code])
end
end
class DoctorInfo < ActiveRecord::Base
belongs_to: user
# ...
end
class HospitalInfo < ActiveRecord::Base
belongs_to: user
# ...
end
如果您想根据用户个人资料视图中的角色显示特定字段,最简单的方法就像他的答案中提到的rmagnum2002一样。
<div>
To show the profiles for all kinds of roles.
</div>
<% @user.is_a_role?(:doctor) %>
<div>
To show the particular information for a user who is a doctor.
You may need something like this: @user.doctor_info.xxx
</div>
<% end %>
<% @user.is_a_role?(:hospital) %>
<div>
To show the particular information for a user who is a hospital.
You may need something like this: @user.hospital_info.xxx
</div>
<% end %>
“告诉不要问”怎么样?再次,取决于您的要求。每个角色之间的角色行为是如此不同并且需要多态(我的意思是纯ruby类多态,而不是模型多态。请注意,角色行为是代码级实现,没有关于数据的任何内容。)处理它们?或者只是某些页面的显示差异?这实际上是另一个故事。