如何在Rails中将不同的控制器映射到1个路由?

时间:2014-03-06 11:47:12

标签: ruby-on-rails

我的应用有两个用户doctorshospitals。医生可以查看案例并对其进行诊断,医院可以为医生创建诊断案例。这都是从他们自己的用户配置文件中完成的。

路线的设置方式如下:doctor_profile_path:转到医生的档案。 hospital_profile_path:去医院的个人资料。

我希望profile_path重定向到用户的个人资料,无论他们拥有什么帐户。这样他们在医院时也无法前往doctor_profile_path,路径名称也更简洁。我该怎么做?

其他问题:

  1. 如何实施授权?
  2. 应该如何构建views文件夹?
  3.   

    的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?

    的延续

2 个答案:

答案 0 :(得分:1)

def profile 
  @user = current_user 
end 
ProfilesController

中的

并添加routes

get '/profile' => 'profiles#profile' 

将为您提供路径:profile_path并与其建立链接<%= link_to 'profile', profile_path %>

现在,如果userdoctorhospital,您可能希望显示不同类型的信息 所以在views/profiles/profile.html.erb你会做

<%= render partial: "#{@user.is_doctor? ? 'doctor' : 'hospital'}"  %>

app/views/profiles

中需要2个部分内容
1 _doctor.html.erb 
2 _hostpital.html.erb

如果您有 user.profile_type 属性:

def is_doctor? 
  self.profile_type == 'doctor'
end

答案 1 :(得分:0)

您可能只需要一个用户模型,但角色不同(医生/医院)。您可以从以下地方开始:

  • rolify - 定义用户模型的角色。
  • cancan - 定义每个角色可以完成的任务。

它们都可以使用身份验证框架,例如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

但医生和医院的特定领域呢?我将创建另外两个模型 - DoctorInfoHospitalInfo来存储这些字段以用于不同的角色,并创建用户模型的关联(属于)。如果用户的角色是医生,则用户只有一个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类多态,而不是模型多态。请注意,角色行为是代码级实现,没有关于数据的任何内容。)处理它们?或者只是某些页面的显示差异?这实际上是另一个故事。