У меня была точно такая же ошибка с проектом, содержащим protobuf lite ( Protocol Buffers от Google) в его classpath. Я предполагаю, что причиной было protobuf-lite.jar
, которое было в моем classpath, и папка проекта была построена на моей предыдущей машине. Когда я скачал Maven и пересобрал файл protobuf-lite.jar
, затем добавил его заново как пользовательскую библиотеку, в мой проект все работало нормально.
Сначала ваша модель пациента
нуждается в accept_nested_attributes_for
class Patient < ActiveRecord::Base
has_many :charge_slips
has_one :address
validates_presence_of :last_name
validates_presence_of :first_name
validates_presence_of :middle_name
accepts_nested_attributes_for :address
end
Ваш контроллер можно значительно упростить. Нет необходимости сохранять адрес отдельно, поскольку об этом позаботится @ Patient.save
. Вам не нужно устанавливать
атрибут created_on
вручную, так как он будет установлен автоматически :) Также при сбое @ Patient.save
вы, вероятно, захотите render: action => 'new'
и не redirect_to: action => 'new'
. Это приведет к повторному отображению формы с любыми ошибками проверки (redirect_to не будет.)
Также обратите внимание, что я переименовал ваш класс контроллера в PatientsController
вместо PatientController
. Это будет больше соответствовать RESTful соглашениям Rails, а также поможет вам немного упростить представление. Если вы сделаете это, вам понадобится map.resources: sizes
в вашем файле routes.db
, и вам также нужно будет переименовать свои файлы.
class PatientsController < ApplicationController
def index
@title = "Outpatient Services - Patient"
@today = Date.today.to_formatted_s(:long)
@patients = Patient.find(:all)
end
def new
@patient = Patient.new
@patient.build_address
end
def create
@patient = Patient.new(params[:patient])
if @patient.save
redirect_to :action => 'index'
else
render :action => 'new'
end
end
end
В вашем представлении есть небольшая ошибка. Это должно быть fields_for: адрес
, а не fields_for @address
. Кроме того, поскольку ваш контроллер теперь работает в режиме RESTful, вы можете удалить часть : url => {: action => "create"}
.
<%= content_tag('h3', 'Create New Patient') %>
<hr>
<% form_for @patient do |patient_form| -%>
<%= error_messages_for :patient %>
<%= patient_form.label :last_name, 'Last Name:' %> <%= patient_form.text_field :last_name, :size => 30 %><br>
<%= patient_form.label :first_name, 'First Name:' %> <%= patient_form.text_field :first_name, :size => 30 %><br>
<%= patient_form.label :middle_name, 'Middle Name:' %> <%= patient_form.text_field :middle_name, :size => 30 %><br>
<fieldset>
<legend>Patient's Permanent Address</legend>
<%= error_messages_for :address %>
<% patient_form.fields_for :address do |address_fields| -%>
<%= address_fields.label :street_name, 'Street Name:' %> <%= address_fields.text_field :street_name %><br>
<%= address_fields.label :barangay, 'Barangay:' %> <%= address_fields.text_field :barangay %><br>
<%= address_fields.label :city_municipality, 'City/Municipality:' %> <%= address_fields.text_field :city_municipality %><br>
<%= address_fields.label :country, 'Country:' %> <%= address_fields.text_field :country %><br>
<%= address_fields.label :zip_cide, 'Zip Code:' %> <%= address_fields.text_field :zip_code %><br>
<% end -%>
</fieldset>
<%= submit_tag "Add Patient" %>
<% end -%>
Надеюсь, это поможет :)