1

TrainingClassRailsアプリケーションで、モデルの作成フォームを設定しようとしています。このフォームで、ユーザーが同じフォーム内に複数のClassMeetingモデル(モデルとbelongs_toの関係を持つ)を作成できるようにしたいのですが、これを使用しています。残念ながら、フォームを送信するたびにエラーメッセージが表示されます。TrainingClassaccepts_nested_attributes_forMeetings class can't be blank

これは、ClassMeetingがあり、保存されるまでIDを取得できないvalidates :class_id, presence: trueためTrainingClassですが、これを回避する正しい方法がわかりません。(私はいくつかの可能な方法を考えることができますが、それらは正確にエレガントな解決策ではありません。)何かアイデアはありますか?あなたが私に与えることができるどんな助けにも感謝します。

注:これに似た質問が過去にかなりの数行われていることに気づきました。しかし、それらの質問のほとんどは古く、時代遅れの答えがあり、それらのどれも私の問題を解決しませんでした。


これが私のコードです。ClassMeeting簡潔にするためにいくつかの側面を簡略化しましたが、モデルとTrainingClassモデルの関係は変更されていないことに注意してください。

ClassMeetingモデル:

# == Schema Information
#
# Table name: class_meetings
#
#  id         :integer         not null, primary key
#  class_id   :integer
#  start      :datetime
#  end        :datetime
#  location   :string(255)
#  created_at :datetime        not null
#  updated_at :datetime        not null
#

class ClassMeeting < ActiveRecord::Base
  attr_accessible :start, :end, :location

  validates :class_id, presence: true
  validates :start, presence: true
  validates :end, presence: true
  validates :location, presence: true, length: {maximum: 255}

  belongs_to :training_class, foreign_key: :class_id, inverse_of: :meetings
end

TrainingClassモデル:

# == Schema Information
#
# Table name: training_classes
#
#  id            :integer         not null, primary key
#  description   :string(255)
#  created_at    :datetime        not null
#  updated_at    :datetime        not null
#

class TrainingClass < ActiveRecord::Base
  attr_accessible :description, :meetings_attributes

  validates :description, length: {maximum: 255}

  has_many :meetings, class_name: :ClassMeeting, foreign_key: :class_id, inverse_of: :training_class

  accepts_nested_attributes_for :meetings, allow_destroy: true
end

TrainingClassesコントローラー:

class TrainingClassesController < ApplicationController
  def new
    @training_class = TrainingClass.new()
    @training_class.meetings.build
  end

  def create
    @training_class = TrainingClass.new()

    if @training_class.update_attributes(params[:training_class])
        redirect_to @training_class, notice: 'Class was successfully created.'
    else
        render "new"
    end
  end
end

TrainingClassフォーム(表示):

<%= form_for @training_class do |f| %>
    <%= render 'shared/error_messages', object: f.object %>

    <%= f.text_area :description %>

    <h2>Schedule</h2>
    <%= f.fields_for :meetings do |meeting| %>
        <%= meeting.label :start, "Start of Meeting:" %>
        <%= meeting.text_field :start %>

        <%= meeting.label :end, "End of Meeting:" %>
        <%= meeting.text_field :end %>

        <%= meeting.label :location, "Location:" %>
        <%= meeting.text_field :location %>
    <% end %>

    <%= f.submit class:"btn btn-large btn-primary" %>
<% end %>
4

2 に答える 2

0

さて、私は自分の問題の解決策を見つけました。私がする必要があるのは、ClassMeetingモデルにclass_idではなくtraining_classが存在することを検証することだけです。このようにして、トレーニングクラスの存在は引き続き検証されますが、バリデーターはaccepts_nested_attributes_forモデルを保存する方法に干渉しません。

class ClassMeeting < ActiveRecord::Base
  attr_accessible :start, :end, :location

  validates :training_class, presence: true # :training_class instead of :class_id
  validates :start, presence: true
  validates :end, presence: true
  validates :location, presence: true, length: {maximum: 255}

  belongs_to :training_class, foreign_key: :class_id, inverse_of: :meetings
end
于 2012-08-02T19:22:47.460 に答える
0

この例を詳しく調べて、コードとの違いを試してみましたが、最終的にはを使用して問題を修正しました:inverse_of

子の関連付けの検証が失敗する場合は、accepts_nested_attributes_を参照してください。

于 2013-06-06T04:14:14.890 に答える