Сочетание сохранения, так что after_update вызывается только один раз - PullRequest
1 голос
/ 01 апреля 2012

Я обнаружил, что мой Projelement обратный вызов after_update срабатывал дважды, потому что я дважды сохранял Projelement ( предыдущий вопрос ):

def update    
  @milestone = Milestone.find(params[:id])

  respond_to do |format|
    if @milestone.update_attributes(params[:milestone])

      # flag that current_user has this milestone
      @milestone.read_by.clear
      @milestone.read_by << current_user
      @milestone.save

    ...
    end
  end
end

Итак, я пытаюсь сделать две вещи:

  1. Сохранить и проверить атрибуты Projelement
  2. Отметьте Projelement, чтобы отметить, что текущий пользователь прочитал его

Разделение их создает два вызова обратного вызова after_update, а это не то, чего я хочу.

Как лучше всего сделать так, чтобы after_update срабатывал только один раз?

1 Ответ

3 голосов
/ 01 апреля 2012

Самое чистое решение - сделать одно сохранение / обновление И позволить модели беспокоиться о назначении read_by следующим образом:

Код контроллера

@milestone = Milestone.find(params[:id])
@milestone.attributes = params[:milestone]
@milestone.set_read_by(current_user) 

# the .save will be the only db transaction
if @milestone.save 
  #... 
else 
  #...
end

milstone.rb (модель) код

def set_read_by(user)
  read_by.clear
  read_by << user
end
...