设置helper_method:current_patient Rails 4

时间:2015-12-03 20:05:33

标签: ruby-on-rails associations

如何在我的应用程序中设置一个辅助方法,当我调用它时,识别来自某个医生的current_patient(可以是多个医生,多个患者为医生)并且可以访问患者:id,这会帮助我关联:

患者接受current_patient咨询的医生

我需要访问患者并在咨询表外键上设置id(患者):patient_id

在控制器的创建动作中我有:

def create
  @consultation = Consultation.new(consultation_params.merge({:patient_id => current_patient}))
  respond_to ...
end

辅助方法是一种很好的方法吗?

我该怎么做?

我的模特:

class Medic < ActiveRecord::Base
  has_many :patients
end

class Patient < ActiveRecord::Base
  belongs_to :medic, :foreign_key => :medic_id
  has_many :consultations
  accepts_nested_attributes_for :consultations
end

class Consultation < ActiveRecord::Base
  belongs_to :patient, :foreign_key => :patient_id
end

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

让我们从路线开始:

resources :patients do
  resources :consultations
end

这将为我们提供嵌套在患者下面的consultations的路线:

                   Prefix Verb   URI Pattern                                            Controller#Action
    patient_consultations GET    /patients/:patient_id/consultations(.:format)          consultations#index
                          POST   /patients/:patient_id/consultations(.:format)          consultations#create
 new_patient_consultation GET    /patients/:patient_id/consultations/new(.:format)      consultations#new
edit_patient_consultation GET    /patients/:patient_id/consultations/:id/edit(.:format) consultations#edit
     patient_consultation GET    /patients/:patient_id/consultations/:id(.:format)      consultations#show
                          PATCH  /patients/:patient_id/consultations/:id(.:format)      consultations#update
                          PUT    /patients/:patient_id/consultations/:id(.:format)      consultations#update
                          DELETE /patients/:patient_id/consultations/:id(.:format)      consultations#destroy

所以我们假设我们有PatientsController#index方法来显示所有患者。在我们看来,我们有类似的东西:

<% @patients.each do |patient| %>
  <li>
    <p><%= patient.name %></p>
  </li>
<% end %>

所以我们添加一个链接来创建咨询:

<% @patients.each do |patient| %>
  <p><%= patient.name %></p>
  <ul class="actions">
    <li>
     <%= link_to "New consultation",
                 new_patient_consultation_path(patient) %>
    </li>
  </ul>
<% end %>

点击该链接会将我们带到/patients/6/consultations/new

因此,在ConsultationsController我们可以从参数中访问患者ID:

class ConsultationsController < ApplicationController

  # We use a callback so that we don't need to do 
  # @patient = Patient.find(params[:id]) in every action
  before_action :set_patient 

  # GET /patients/:patient_id/consultations/new
  def new
    @consultation = @patient.consultations.new
  end

  # POST /patients/:patient_id/consultations
  def create
    @consultation = @patient.consultations.new(consultation_params)

    # ...
  end

  # ...

  private
    def set_patient
      @patient = Patient.find(params[:patient_id])
    end
    # ...
end

set_patient只是属于控制器的私有方法。这不是您使用辅助方法的情况。

它经常在处理身份验证时处理,因为你从会话中获得current_user - 独立于params。如果要创建辅助方法,它应该可以在任何地方使用。

要使这一点工作,最后需要做一件事,表单需要指向/patients/:patient_id/consultations

# app/views/consultations/_form.html.erb
<% form_for [@patient, @consultation] do |f| %>
   # .. rails does all the magic figuring out the url.
<% end %>