模型之间关系的 NoMethodError
NoMethodError for relationship between models
我正在我的两个模型之间建立关系。患者模型和工作列表模型。我的病人可以属于一个工作列表,一个工作列表可以有很多病人。在我的患者表格中,我希望能够从下拉菜单中 select 工作列表。我在表单中创建了一个方法,但它抛出了一个错误。这是我的代码:
来自 _form.html.erb:
<div class="field">
<%= f.label :worklist_id %>
<%= f.collection_select :worklist_id, @worklists, :id , :name %>
</div>
来自 patient.rb:
class Patient < ActiveRecord::Base
belongs_to :worklist
end
来自 worklist.rb
class Worklist < ActiveRecord::Base
has_many :patients
end
来自 schema.rb
create_table "patients", force: :cascade do |t|
t.string "lastname"
t.string "middlename"
t.string "firstname"
t.date "birthdate"
t.string "sex"
t.string "ethnicity"
t.string "uniqueid"
t.string "accountnumber"
t.string "medicaidid"
t.string "medicareid"
t.string "ssn"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "worklist_id"
end
这是我得到的错误:
NoMethodError in Patients#edit
undefined method `worklist_select'
这是 PatientController:
class PatientsController < ApplicationController
before_action :set_patient, only: [:show, :edit, :update, :destroy]
# GET /patients
# GET /patients.json
def index
@patients = Patient.all
end
# GET /patients/1
# GET /patients/1.json
def show
end
# GET /patients/new
def new
@patient = Patient.new
end
# POST /patients
# POST /patients.json
def create
@patient = Patient.new(patient_params)
@worklists = Worklist.all
respond_to do |format|
if @patient.save
format.html { redirect_to @patient, notice: 'Patient was successfully created.' }
format.json { render :show, status: :created, location: @patient }
else
format.html { render :new }
format.json { render json: @patient.errors, status: :unprocessable_entity }
end
end
end
# GET /patients/1/edit
def edit
end
# PATCH/PUT /patients/1
# PATCH/PUT /patients/1.json
def update
respond_to do |format|
if @patient.update(patient_params)
format.html { redirect_to @patient, notice: 'Patient was successfully updated.' }
format.json { render :show, status: :ok, location: @patient }
else
format.html { render :edit }
format.json { render json: @patient.errors, status: :unprocessable_entity }
end
end
end
# DELETE /patients/1
# DELETE /patients/1.json
def destroy
@patient.destroy
respond_to do |format|
format.html { redirect_to patients_url, notice: 'Patient was successfully destroyed.' }
format.json { head :no_content }
end
end
def import
Patient.import(params[:file])
redirect_to patients_path, notice: "Patients Added Successfully"
end
private
# Use callbacks to share common setup or constraints between actions.
def set_patient
@patient = Patient.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def patient_params
params.require(:patient).permit(:lastname, :middlename, :firstname, :birthdate, :sex, :ethnicity, :uniqueid, :accountnumber, :medicaidid, :medicareid, :ssn, :worklist_id)
end
end
Worklist.all
中的视图是有问题的。直接与数据库对话的视图从来都不好。这是控制器(或服务)的工作。
在您的控制器中,您需要类似以下内容:@worklists = Worklist.all
,然后在视图中使用 @worklists
。
但这只是一个开始。您可以 post 您的控制器以便我们进一步提供帮助吗?
更新:现在我们对进展有了更好的了解。让我们这样做:
因此,在您的 PatientsController 中,您需要在创建方法中使用:
@worklists = Worklist.all
然后在您的 _form.html.erb
(来自患者文件夹而不是工作列表文件夹)中,您需要:
<%= f.label :worklist_id %>
<%= f.collection_select :worklist_id, @worklists, :id , :name %>
我想如果你只是改变这个:
<%= worklist_select( :patient, :worklist_id, Worklist.all, :id, :name, {}, { :multiple => false } ) %>
更像这样:
<%= f.select( :worklist_id, Worklist.all, :id, :name, {}, { :multiple => false } ) %>
你可能会得到你想要的。
我正在我的两个模型之间建立关系。患者模型和工作列表模型。我的病人可以属于一个工作列表,一个工作列表可以有很多病人。在我的患者表格中,我希望能够从下拉菜单中 select 工作列表。我在表单中创建了一个方法,但它抛出了一个错误。这是我的代码:
来自 _form.html.erb:
<div class="field">
<%= f.label :worklist_id %>
<%= f.collection_select :worklist_id, @worklists, :id , :name %>
</div>
来自 patient.rb:
class Patient < ActiveRecord::Base
belongs_to :worklist
end
来自 worklist.rb
class Worklist < ActiveRecord::Base
has_many :patients
end
来自 schema.rb
create_table "patients", force: :cascade do |t|
t.string "lastname"
t.string "middlename"
t.string "firstname"
t.date "birthdate"
t.string "sex"
t.string "ethnicity"
t.string "uniqueid"
t.string "accountnumber"
t.string "medicaidid"
t.string "medicareid"
t.string "ssn"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "worklist_id"
end
这是我得到的错误:
NoMethodError in Patients#edit
undefined method `worklist_select'
这是 PatientController:
class PatientsController < ApplicationController
before_action :set_patient, only: [:show, :edit, :update, :destroy]
# GET /patients
# GET /patients.json
def index
@patients = Patient.all
end
# GET /patients/1
# GET /patients/1.json
def show
end
# GET /patients/new
def new
@patient = Patient.new
end
# POST /patients
# POST /patients.json
def create
@patient = Patient.new(patient_params)
@worklists = Worklist.all
respond_to do |format|
if @patient.save
format.html { redirect_to @patient, notice: 'Patient was successfully created.' }
format.json { render :show, status: :created, location: @patient }
else
format.html { render :new }
format.json { render json: @patient.errors, status: :unprocessable_entity }
end
end
end
# GET /patients/1/edit
def edit
end
# PATCH/PUT /patients/1
# PATCH/PUT /patients/1.json
def update
respond_to do |format|
if @patient.update(patient_params)
format.html { redirect_to @patient, notice: 'Patient was successfully updated.' }
format.json { render :show, status: :ok, location: @patient }
else
format.html { render :edit }
format.json { render json: @patient.errors, status: :unprocessable_entity }
end
end
end
# DELETE /patients/1
# DELETE /patients/1.json
def destroy
@patient.destroy
respond_to do |format|
format.html { redirect_to patients_url, notice: 'Patient was successfully destroyed.' }
format.json { head :no_content }
end
end
def import
Patient.import(params[:file])
redirect_to patients_path, notice: "Patients Added Successfully"
end
private
# Use callbacks to share common setup or constraints between actions.
def set_patient
@patient = Patient.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def patient_params
params.require(:patient).permit(:lastname, :middlename, :firstname, :birthdate, :sex, :ethnicity, :uniqueid, :accountnumber, :medicaidid, :medicareid, :ssn, :worklist_id)
end
end
Worklist.all
中的视图是有问题的。直接与数据库对话的视图从来都不好。这是控制器(或服务)的工作。
在您的控制器中,您需要类似以下内容:@worklists = Worklist.all
,然后在视图中使用 @worklists
。
但这只是一个开始。您可以 post 您的控制器以便我们进一步提供帮助吗?
更新:现在我们对进展有了更好的了解。让我们这样做:
因此,在您的 PatientsController 中,您需要在创建方法中使用:
@worklists = Worklist.all
然后在您的 _form.html.erb
(来自患者文件夹而不是工作列表文件夹)中,您需要:
<%= f.label :worklist_id %>
<%= f.collection_select :worklist_id, @worklists, :id , :name %>
我想如果你只是改变这个:
<%= worklist_select( :patient, :worklist_id, Worklist.all, :id, :name, {}, { :multiple => false } ) %>
更像这样:
<%= f.select( :worklist_id, Worklist.all, :id, :name, {}, { :multiple => false } ) %>
你可能会得到你想要的。