2017-10-10 96 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