Вместо того, чтобы заново изобретать колесо, вы можете просто использовать Rails помощники по форме даты и времени :
<%= form_with(model: counter, local: true) do |form| %>
...
<div class="field">
<%= form.label :meta %>
<%= form.datetime_select :meta %>
</div>
<div class="actions">
<%= form.submit %>
</div>
<% end %>
Это создает довольно странные параметры:
{"titelo"=>"", "meta(1i)"=>"2018", "meta(2i)"=>"10", "meta(3i)"=>"12", "meta(4i)"=>"18", "meta(5i)"=>"33"}
meta(1i)
это, например, год.1 - это часть, а i
- это формат (в данном случае целое число).
Когда вы разрешите ключ :meta
Rails также разрешит все многопараметрические ключи, как они известны.
(byebug) params.require(:counter).permit(:titelo, :meta)
<ActionController::Parameters {"titelo"=>"", "meta(1i)"=>"2018", "meta(2i)"=>"10", "meta(3i)"=>"12", "meta(4i)"=>"18", "meta(5i)"=>"42"} permitted: true>
И поскольку ActiveRecord знает, что столбец является столбцом даты и времени, он будет правильно назначать атрибут:
irb(main):005:0> Counter.new({"titelo"=>"", "meta(1i)"=>"2018", "meta(2i)"=>"10", "meta(3i)"=>"12", "meta(4i)"=>"18", "meta(5i)"=>"42"})
=> #<Counter id: nil, titelo: "", meta: "2018-10-12 18:42:00", created_at: nil, updated_at: nil>
Итак, все, что вам нужно в вашем контроллере:
class CountersController < ApplicationController
# ...
# POST /counters
# POST /counters.json
def create
@counter = Counter.new(counter_params)
respond_to do |format|
if @counter.save
format.html { redirect_to @counter, notice: 'Counter was successfully created.' }
format.json { render :show, status: :created, location: @counter }
else
format.html { render :new }
format.json { render json: @counter.errors, status: :unprocessable_entity }
end
end
end
# ...
private
# Never trust parameters from the scary internet, only allow the white list through.
def counter_params
params.require(:counter).permit(:titelo, :meta)
end
end