Использование .dup и .update_attributes для генерации экземпляра модели вызывает создание дополнительных экземпляров при неудачной проверке - PullRequest
0 голосов
/ 09 февраля 2012

У меня есть проверка для модели Activity, и это действие create в activity_controller. Когда я пытаюсь сохранить модель, не выполняя проверки, создается дополнительный экземпляр действия. Почему создается действие, когда оно не проходит валидацию?

def create
    @activity_last = Activity.find(params[:activity_id])
    @activity = @activity_last.dup
    @activity.activity_date = Time.now

    respond_to do |format|
      if @activity.update_attributes(params[:activity])
        format.html { redirect_to @activity.tenant, notice: 'Activity was successfully created.' }
        format.json { render json: @activity.tenant, status: :created, location: @activity.tenant }
      else
        format.html { render action: "new" }
        format.json { render json: @activity.errors, status: :unprocessable_entity }
      end
    end
  end

Причина, по которой я здесь использую dup, заключается в том, что я хочу создать дубликат последнего действия, а затем обновить подмножество его атрибутов из параметров. Итак, для объяснения, скажем, у Activity было 10 атрибутов. Пользователь может перейти к форме, которая имеет поле для 3 из этих атрибутов. Затем я хочу создать новое действие, которое имеет все те же значения атрибутов, что и последнее действие, для атрибутов, которые пользователь не обновляет.

- Обновление -

Я раскрыл, почему это происходило. Я сократил код выше, чтобы было меньше помех, но в рамках этого сокращения я вырезал следующие строки:

@comment = Comment.new(params[:comment])
@comment.user = current_user
@comment.activity = @activity
@comment.save!

Приложение работает правильно, когда я перемещаю сохранение комментария в после сохранения действия. Я полагаю, что сохранение комментария, связанного с несохраненным действием, приводит к сохранению действия?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...