Почему, когда я пытаюсь создать объект Datetime с вводом пользователя, в качестве параметра указывается недопустимая дата - PullRequest
0 голосов
/ 12 октября 2018

Итак, я новичок и пытаюсь создать счетчик.Поэтому моя проблема заключается в том, что, когда я пытаюсь передать параметры: year,: month и т. Д. Объекту DateTime, он постоянно сообщает мне, что это недопустимая дата.

Итак, вот мой класс контроллера.

class CountersController < ApplicationController
def new
end

def create
  @counter= Counter.new(counter_params)

  @counter.save
  redirect_to @counter
end
private
    def counter_params
        @titulo=params[:titulo]
        @year=params[:year].to_i
        @month=params[:month].to_i
        @day=params[:day].to_i
        @hour=params[:hour].to_i
        @minute=params[:minute].to_i    
        d= DateTime.new(@year,@month,@day,@hour,@minute)
        c_p={"meta"=>d,"titulo"=>@titulo}
    end

end введите описание изображения здесь

1 Ответ

0 голосов
/ 12 октября 2018

Вместо того, чтобы заново изобретать колесо, вы можете просто использовать 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
...