button_to изменение состояния объекта - PullRequest
1 голос
/ 25 марта 2011

Я пытаюсь изменить состояние объекта либо:

1) пользователь нажимает кнопку в /view/matchdays/index.html.erb:

<%= button_to "End Matchday", {:action => :end_matchday}, :class => "push-9" %>

2) или если прошло 2 дня. Каждый раз, когда пользователь переходит к индексу, он запускает end_of_matchday_check, чтобы проверить, правильно ли это.

matchdays_controller.rb:

  def index
    @matchdays = Matchday.all
    @current_matchday = Matchday.last
    # Runs a check on the last matchday whether user can edit the matchday
    end_of_matchday_check unless Matchday.all.empty?
  end

  def end_matchday
    @current_matchday = Matchday.last
    @current_matchday.update_attributes(:ended => true)
    redirect_to matchdays_path
  end

  private

# Returns true if the last matchday has exceeded 2 days = the allowable editing priod.
  def end_of_matchday_check
      @current_matchday = Matchday.last
      unless @current_matchday.ended? 
        @current_matchday.update_attributes(:ended => true) if @current_matchday.created_at + 2.days > Time.now
      end
  end

Однако я продолжаю сталкиваться с этой проблемой (журнал разработки):

WARNING: Can't mass-assign protected attributes: ended

Но если я закомментирую строку attr_accessible или добавлю: конец к ней, она будет работать. Однако каждый раз, когда я посещаю страницу индекса, она будет меняться на matchday.ended на true каждый раз, когда я создаю новый объект для игрового дня.

Matchday.rb:

attr_accessible :name, :best_of, :description

Есть идеи, почему это происходит?

Ответы [ 2 ]

0 голосов
/ 25 марта 2011

Я наконец понял это. Мой

@current_matchday.created_at + 2.days > Time.now 

логика была неправильной. Должно быть

@current_matchday.created_at + 2.days < Time.now 

<вместо>. Текущее время должно быть более 2 дней, после чего он изменит атрибут на true и не изменит его в течение 2 дней.

Обновление

Сначала я применил решение flOOr, изменив

 @current_matchday.update_attributes(:ended => true)

до

@current_matchday.update_attribute(:ended, true)

После применения его решения появился другой, и я по ошибке написал об этом, думая, что это решение.

Извините за смешение flOOr и еще раз спасибо, очень признателен:)

0 голосов
/ 25 марта 2011
def end_matchday
  @current_matchday = Matchday.last
  @current_matchday.ended = true
  @current_matchday.save
  redirect_to matchdays_path
end

или

def end_matchday
  @current_matchday = Matchday.last
  @current_matchday.update_attribute( :ended, true )
  redirect_to matchdays_path
end

UPD

ок.

Вы должны удалить все update_attributes(:ended => true) до update_attribute(:ended, true) или @object.ended = true; @object.save

РЕЗЮМЕ

 def index
    @matchdays = Matchday.all
    @current_matchday = Matchday.last
    # Runs a check on the last matchday whether user can edit the matchday
    end_of_matchday_check unless Matchday.all.empty?
  end

  def end_matchday
    @current_matchday = Matchday.last
    @current_matchday.update_attribute(:ended, true)
    redirect_to matchdays_path
  end

  private

  # Returns true if the last matchday has exceeded 2 days = the allowable editing priod.
  def end_of_matchday_check
      @current_matchday = Matchday.last
      unless @current_matchday.ended? 
        @current_matchday.update_attribute(:ended, true) if @current_matchday.created_at + 2.days > Time.now
      end
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...