2017-10-10 84 views
0

我有一個控制器(患者)將patient_id傳遞給另一個控制器(referral_requests)以用於構建引薦請求記錄。嘗試創建引薦請求時,我遇到以下錯誤。我究竟做錯了什麼?我的referral_requests表包含user_id的整數列。Rails:ActiveModel創建新記錄時出錯

我有多個用戶類型定義與枚舉。工作人員用戶創建患者和轉診請求。

感謝您的幫助!

錯誤:

(0.1ms) rollback transaction 
#<ActiveModel::Errors:0x007fe696696fc0 @base=#<ReferralRequest id: nil, content: nil, user_id: nil, created_at: nil, updated_at: nil, patient_id: 4, call_option_1: nil, call_option_2: nil, call_option_3: nil, call_option_1_status: nil, call_option_2_status: nil, call_option_3_status: nil, status: "created">, @messages={:user_id=>["can't be blank"]}, @details={:user_id=>[{:error=>:blank}]}> 

患者控制器創建行動:

def create 
    @patient = current_user.patients.build(patient_params) 
    if @patient.save 
    flash[:success] = "Patient Created!" 
    redirect_to new_referral_request_path(patient_id: @patient.id) 
    else 
    Rails.logger.info(@patient.errors.inspect) 
    render 'patients/new' 
end 

referral_requests控制器新創建行動,而params:

def new 
    @patient = Patient.find(params[:patient_id]) 
    @referral_request = current_user.referral_requests.build(patient: @patient) if signed_in? 
end 

def create 
    @referral_request = current_user.referral_requests.build(referral_request_params) 
    if @referral_request.save 
     flash[:success] = "Referral Request Created!" 
     redirect_to new_dispatch_path(referral_request_id: @referral_request.id) 
    else 
    Rails.logger.info(@referral_request.errors.inspect) 
    @feed_items = [] 
    render 'static_pages/home' 
    end 
end 

private 

def referral_request_params 
    params.require(:referral_request).permit(:content, :user_id, :patient_id, concern_ids: [], insurance_ids: [], race_ids: [], language_ids: [], gender_ids: []) 
end 

這裏是模型中的關係:

require 'active_support/concern' 

module StaffUser 
    extend ActiveSupport::Concern 

    included do 
    has_many :referral_requests, foreign_key: "user_id" 

class ReferralRequest < ApplicationRecord 
    belongs_to :user, -> { where role: :staff }, class_name: 'User', foreign_key: 'user_id' 

回答

1

如果要創建轉介病人你應該讓一個嵌套的資源:

resources :patients do 
    resources: :referral_requests, shallow: true 
end 

自從創建此資源應該需要身份驗證,你要確保處理,在過濾前:

class ReferralRequestsController < ApplicationController 
    before_action :authenticate_user! 
end 

如果你正在自己的身份驗證解決方案,而不是使用設計,確保你有這樣的方法:

class ApplicationController 
    private 
    def authenticate_user! 
    redirect_to new_session_path and return unless current_user 
    end 
end 

當我們創造,我們沒有采取user_id(由會議提供的),也不是資源筆記患者ID(我們從路徑段獲取)從表單輸入中獲得。

class ReferralRequestsController < ApplicationController 
    before_action :authenticate_user! 
    before_action :set_patient, only: [:new, :create, :index] 

    # GET /patients/:patient_id/referral_requests/new 
    def new 
    @referral_request = @patient.referral_requests.new 
    end 

    # POST /patients/:patient_id/referral_requests 
    def create 
    @referral_request = @patient.referral_requests.new(referral_request_params) do |rr| 
     rr.user = current_user 
    end 

    if @referral_request.save 
     flash[:success] = "Referral Request Created!" 
     redirect_to new_dispatch_path(referral_request_id: @referral_request.id) 
    else 
     Rails.logger.info(@referral_request.errors.inspect) 
     @feed_items = [] 
     render :new 
    end 
    end 

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

    def referral_request_params 
    params.require(:referral_request) 
     .permit(:content, 
      concern_ids: [], 
      insurance_ids: [], 
      race_ids: [], 
      language_ids: [], 
      gender_ids: [] 
     ) 
    end 
end 

使用過濾器之前會在這裏也將驗證該患者存在的,因爲Patient.find(params[:patient_id])將提高ActiveRecord::RecordNotFound

的一個好方法來處理情況,記錄應與用戶輸入和其他值創造了這樣來自會話的用戶ID是通過一個塊:

@referral_request = @patient.referral_requests.new(referral_request_params) do |rr| 
    rr.user = current_user 
end 

允許從形式user_id PARAM將使惡意用戶只需通過網絡檢查員更改輸入即可傳遞任何用戶ID!

您可以通過傳遞一個數組創建形式正確的路徑:

<%= form_for([@patient, @referral_request]) do |f| %> 
+0

謝謝Max - 與淺:真的,你打算使用referral_requests而不是推介?我只是想確保沒有一些別名正在進行,我不理解。 – mike9182

+0

是的,它應該是'resources :: referral_requests,shallow:true'。 – max

+0

這是非常有用的 - 爲什麼patient_id不包含在params中? – mike9182

1

「user_ID的」 不應該在你的允許參數列表。

編輯:

的實際問題,從註釋是,他確認,而不是「用戶」,「USER_ID」的存在。當通過關聯的ID不會,直到後來在這個過程中充滿創造的記錄,所以你只要檢查相關項目的存在,而不是ID:

validates :user, presence: true 
+0

我只是刪除,仍然得到同樣的錯誤 - 我想我補充它希望將修復它。 – mike9182

+0

當我在調用請求被保存在引用請求控制器的create方法中之前添加調試器時,我可以看到,當我調用引用請求時,user_id爲零,但current_user似乎正在工作,因爲它返回當前用戶。 – mike9182

+0

要清楚 - 我正在執行對引用請求的模型驗證,要求user_id存在。我只是不明白爲什麼它沒有被傳遞給引薦請求,即使current_user正在評估也沒問題。 – mike9182