Solucionado (ver solução)
Solucionado
(ver solução)
11
respostas

Como preencher o campo de datahora sem a necessidade do usuário preencher?

Eu criei dois modelos, um para usuário e outro para aviso do usuario e no form de criar aviso novo o campo datahora está habilitado para preenchimento manual sendo que eu quero que o usuário não tenha a necessidade de preencher e quando ele der submit no form, o registro do datahora dele seja o do momento do submit.

segue o trecho do _form.html.erb:

  <div class="field">
    <%= form.label :datahora %>
    <%= form.datetime_select :datahora, id: :aviso_datahora %>
  </div>

eu excluí essa parte, mas agora o campo fica preenchido em branco nos registros e não tem aulas falando sobre como mexer em forms no ruby on rails

11 respostas

Você não pode usar os timestamps do Rails na migration? Toda migration padrão do Rails tem um timestamp que marca quando aquele objeto foi criado no banco, o created_at. Ele não serve?

Eu usei o timestamps aqui e funcionou, mas mais adiante precisarei fazer umas entradas manuais como essa no sistema e essa pergunta será inevitável.

Outra coisa, como mudar o fuso mostrado?

Na documentação do datetime_select tem alguns exemplos você pode colocar o default: Time.zone.today.

Quanto a timezone no seu application.rb você tem que configurar a timezone para 'Brasilia', link da documentação. É interessante configurar a timezone na máquina também quando for fazer deploy.

coloquei no applications.rb:

config.time_zone = 'Brasilia'

conforme descrito na figura a seguir:

require_relative 'boot'

require 'rails/all'

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module Sistema
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 5.1
    config.time_zone = 'Brasilia'
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.
  end
end

Porém continuou mostrando as datas em UTC.

Também tenho outra dúvida, se um usuário de outro fuso horário acessar meu servidor ele verá no fuso dele ou no fuso que eu escolher aqui?

Se for no fuso que eu determinar, como fazer para mostrar no fuso do computador do usuário?

Coloca também essa linha pra configurar a parte do banco: config.active_record.default_timezone = :local

Então, a timezone do user vem do browser então você teria que fazer isso via javascript, mas podem ocorrer erros como o usuário estar com a data do computador errada. Não sei se é interessante, tem algum motivo específico de você querer saber a timezone do usuário?

Tudo bem, vou trabalhar com tempo passado (há 10 minutos, por exemplo).

Mas, como mostrar no fuso horário de Brasília? Do jeito que você me falou não está funcionando.

Você não precisa do fuso pra isso se for pra mostrar uma informação tipo "criado a 10 minutos" você pode usar o helper time_ago_in_words.

Tudo bem, mas de qualquer maneira vou precisar saber fazer isso porque a partir de um tempo eu quero mostrar o data-hora.

Consegui implementar o "há XX tempo atrás" com o código:

<% diff = DateTime.parse("#{DateTime.now}").to_time - DateTime.parse("#{aviso.created_at}").to_time %>
            <% horas = (diff / 3600).floor %>
            <% minutos = ((diff / 60) % 60).floor  %>
            <% segundos = (diff % 60).floor  %>
            <%= time_ago_in_words((horas.hours + minutos.minutes + segundos.seconds).ago) %>

Porém está tudo em inglês e eu quero passar para português, como fazer?

solução!

Coloca essas duas linhas no seu application.rb

config.i18n.available_locales = [:en, :'pt-BR']
config.i18n.default_locale = :'pt-BR'

E essas linhas de código num arquivo pt-BR.yml dentro da pasta config/locale

Linhas de código

Isso é conhecido como I18n(Internacionalization) você pode ler mais na documentação do Rails

Perfeito, funcionando bem. Obrigado!!