Почему моя приписанная строка преобразования в число в Rails - PullRequest
0 голосов
/ 03 января 2019

Я создаю форму, в которой пользователи могут вводить длительность в виде строки, например «08:00» или «3:10». Моя идея состояла в том, чтобы преобразовать это в правильное количество секунд в before_validation обратном вызове.

Но почему-то Rails что-то делает перед обратным вызовом, поскольку значение всегда равно "0", когда пользователь вводит "08:00" или "3", когда пользователь вводит "3:10".

В моей форме ничего не издевается;

<%= f.text_field :duration, required: true, class: 'input' %>

в моем контроллере;

def create
  @entry = Entry.new entry_params
end

private 

def entry_params
  params.require(:entry).permit(:date, :duration, :project_id)
end

Или в моей модели;

class Entry < ApplicationRecord
  belongs_to :project

  validates :duration, presence: true

  before_validation :normalize_duration

  def duration_formatted(format = '%H:%M')
    Time.at(duration).utc.strftime format
  end

  private

  def normalize_duration
    # Always receiving the first character here :(
    p self.inspect
  end
end

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Необходимо перезаписать метод def duration = (значение), который генерируется активной записью. Вместо использования перед проверкой, вы должны сделать что-то вроде этого:

    def duration=(value)
      seconds = Time.parse(value).utc.to_i - Time.parse("00:00").utc.to_i

      self[:duration] = seconds
    end
0 голосов
/ 03 января 2019

I думаю , что вы хотите сделать, это сравнить введенный duration с "нулевым временем" (0:00).Затем вы можете извлечь истекшее время в секундах на основе введенного пользователем значения duration:

def duration_in_seconds
  Time.parse(duration).utc.to_i - Time.parse("00:00").utc.to_i
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...