Ошибка AssociationTypeMismatch на приложении Ruby on Rails

У меня была точно такая же ошибка с проектом, содержащим protobuf lite ( Protocol Buffers от Google) в его classpath. Я предполагаю, что причиной было protobuf-lite.jar, которое было в моем classpath, и папка проекта была построена на моей предыдущей машине. Когда я скачал Maven и пересобрал файл protobuf-lite.jar, затем добавил его заново как пользовательскую библиотеку, в мой проект все работало нормально.

9
задан 23 July 2009 в 05:45
поделиться

1 ответ

Сначала ваша модель пациента нуждается в 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 -%>

Надеюсь, это поможет :)

28
ответ дан 4 December 2019 в 07:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: