0

У меня есть две модели: расписание и задача. Задача принадлежит_описанию и расписанию has_many задач. Форма для задач - это вложенная форма расписания. Я пытаюсь написать либо код контроллера, либо модельный метод, который будет принимать пользовательское время datetime (называемое: time_frame) для задачи, и если это время-дата уже произошло (было в прошлом), выплевывает уведомление и перенаправляет. Я попытался сделать это несколькими способами, но никто из них не работал. Я пытался писать этот контроллер код для графики # обновления:рельсы - манипулировать данными datetime before_update

schedule_params[:tasks_attributes].each do |task| 
    if task[:time_frame] < DateTime.now 
     render 'update', :notice => 'You must pick a future time.' 
    end 
end 

А вот schedule_params:

def schedule_params 
     params.require(:schedule).permit(:emp_accepts, 
     tasks_attributes: [:title, :content, :_destroy, :time_frame, 
     :complete_time])  
end 

, но я был возвращаемые ошибки:

no implicit conversion of symbol to integer 

Я пытался писать метод модели например, в модели Списка:

before_update :compare_datetimes 

def compare_datetimes 
    puts 'before task is found' 
    self.tasks.each do |task| 
     puts 'here is the task' 
     if task.time_frame < DateTime.now 
      puts 'It is in the past' 
     end 
    end 
end 

«перед тем, как задача найдена» помещается на сервер, но ни одна из двух других puts не выполняется. Как мне это сделать?

ответ

1

Вы хотите добавить проверку модели задачи, чтобы сделать проверку на time_frame, прежде чем сохранить его:

class Task < ActiveRecord::Base 
    validate :time_frame, presence: true # if you require time_frame to always be present 
    validate :datetime_in_future 

    private 

    def datetime_in_future 
    # if time_frame is optional, check its presence before comparing 
    if !self.time_frame.blank? && self.time_frame < DateTime.now 
     errors.add :time_frame, 'must be a future time.' 
    end 
    end 
end 

Это должно привести к аннулированию ассоциаций и, следовательно, график, при сохранении или обновление Это.

О контроллере: Причина того, что не работает в том, что, которого не разобрать time_frame перед сравнением с DateTime, вы должны сделать это:

if DateTime.parse(task[:time_frame]) < DateTime.now 
    # code here ... 

Это потому, что контроллер видит значение time_frame в его необработанную строчную форму. Когда вы назначаете его своей задаче, activerecord будет передавать ее в тип данных столбца, который является datetime (я предполагаю, что вы установите его таким образом в процессе миграции).

Update: Что касается ошибки контроллера, где вы получите no implicit conversion of symbol to integer The tasks_attributes индексированный хэш так что вам нужно перебрать это так:

schedule_params[:tasks_attributes].each_pair do |index, task| 
    if task[:time_frame] < DateTime.now 
     render 'update', :notice => 'You must pick a future time.' 
    end 
end 

Но, конечно же, проверка на модели задачи является лучший способ решить эту проблему.

+0

Спасибо, я попробовал метод проверки, но он возвращает ошибку «неопределенный метод' <»для ноля: NilClass', если time_Frame пустого – Philip7899

+0

, если вам требуется time_frame всегда присутствовать добавить присутствие валидатора перед datetime_in_future валидатора. Я обновлю свой ответ. – DiegoSalazar

+0

Спасибо. Что касается контроллера, он все равно возвращает такое же неявное преобразование символа в строку ошибки? – Philip7899

Смежные вопросы