5

Rails 4 で複雑な問題が発生しています。これについては、以下で説明します。シンプルなフォームと awesome_nested_fields ジェムを使用しています。

アプリにいくつかのフィールドを持つイベントがたくさんあります

これは、accepts_nested_attributes の実装前の作業中の event_controller パラメータです。

private

  def event_params
    params.require(:event).permit(:title, :description, :type_id, :price, :program,
                                  :start_date, :end_date, :image, category_ids: [])
  end

ここで、イベントにいくつかのスピーカーを追加し、イベントごとに必要なスピーカーの数をユーザーに決定させたいと思います。そのため、ドキュメントに従って、ネストされたフィールドの宝石を追加し、スピーカーをネストされたフィールドにしています。

イベント.rb

class Event < ActiveRecord::Base
  has_many :speakers
  accepts_nested_attributes_for :speakers, allow_destroy: true
end

Speaker.rb

class Speaker < ActiveRecord::Base
  belongs_to :event
end

スピーカーの追加 (追加イベント simple_form_for 内):

  <%= f.nested_fields_for :speakers do |f| %>
      <fieldset class="item">
        <%= f.label :name %>
        <%= f.text_field :name %>

        <a href="#" class="remove">remove</a>

        <%= f.hidden_field :id %>
        <%= f.hidden_field :_destroy %>
    </fieldset>
  <% end %>

強力なパラメーターのコントローラーを更新します。

private

  def event_params
    params.require(:event).permit(:title, :description, :type_id, :price, :program,
                                  :start_date, :end_date, :image, category_ids: [],
                                  speakers_attributes: [ :name ])
  end

アプリを起動すると、新しいイベントの作成時に次のようになります。

can't write unknown attribute `event_id'

私が削除した場合

speakers_attributes: [ :name ]

強力なパラメータからイベントを作成できますが、表示または編集しようとすると取得されます

SQLite3::SQLException: no such column: speakers.event_id: SELECT "speakers".* FROM "speakers"  WHERE "speakers"."event_id" = ?

もちろん、データベースには作成されたスピーカーはありません。

>> s = Speaker.first
=> nil

助けやアドバイスをいただければ幸いです。ありがとうございました!

=====

重複の問題について更新

イベントコントローラー

  def update
    @event = Event.find(params[:id])

    if @event.update(event_params)
      flash[:success] = "Event updated"
      redirect_to @event
    else
      render @event  
    end
  end

event.rb

class Event < ActiveRecord::Base

  belongs_to :type

  has_many :categorizations
  has_many :categories, through: :categorizations
  has_many :speakers
  accepts_nested_attributes_for :speakers, allow_destroy: true

  @today = Date.today

  def self.future_events
    order('start_date ASC').where('start_date >= ?', @today)
  end

  scope :current_events,  lambda { where('start_date < ? and end_date > ?', @today, @today) }
  scope :past_events,     lambda { order('end_date DESC').where('end_date < ?', @today) }

  scope :future_by_type,   lambda { |type| order('start_date ASC').where('type_id = ? and start_date >= ?', type, @today) }
  scope :current_by_type,  lambda { |type| order('start_date ASC').where('type_id = ? and start_date < ? and end_date > ?', type, @today, @today) }
  scope :past_by_type,     lambda { |type| order('start_date ASC').where('type_id = ? and end_date < ?', type, @today) }

  validates :title, presence: true

  mount_uploader :image, ImageUploader

  before_save :define_end_date
  before_save :zero_price

    private

      def define_end_date
        self.end_date ||= self.start_date
      end

      def zero_price
        if self.price.empty?
          self.price = 0
        end 
      end
end
4

1 に答える 1

13

考えてみれば強いパラメータが関係しているのかもしれません。id更新を機能させるには、属性も許可する必要があります。permit パラメータに、speakers更新される使用中の id およびその他のネストされたネストされたリソースを追加します。

これを試してください:

def event_params
  params.require(:event).permit(:title, :description, :type_id, :price, :program,
                              :start_date, :end_date, :image, category_ids: [],
                              speakers_attributes: [ :id, :name ])
end 
于 2013-08-19T09:08:51.887 に答える