Rails中的日期和时间文本框

时间:2015-12-05 19:42:41

标签: ruby-on-rails

我正在学习RoR并尝试将为脚手架生成的日期时间字段生成的默认5下拉列表控件替换为两个文本框,一个用于日期,另一个用于时间。

在我的示例中,我运行以下命令来生成Posts资源:

rails g scaffold post name:string content:text published_at:datetime

enter image description here

到目前为止,我做了以下更改:

post.rb

class Post < ActiveRecord::Base

  attr_accessor :published_at_date, :published_at_time

  after_initialize :get_datetimes
  before_validation :set_datetimes

  def get_datetimes
    self.published_at ||= Time.now

    self.published_at_date ||= self.published_at.to_date.to_s(:db)
    self.published_at_time ||= "#{'%02d' % self.published_at.hour}:#{'%02d' % self.published_at.min}"
  end

  def set_datetimes
    self.published_at = "#{self.published_at_date} #{self.published_at_time}:00"
  end  
end

posts_controller.rb

class PostsController < ApplicationController
  before_action :set_post, only: [:show, :edit, :update, :destroy]

  def post_params
    params.require(:post).permit(:content, :name, :published_at, :published_at_date, :published_at_time)
  end
  ....
end

_form.html.erb

<%= form_for(@post) do |f| %>
  ....
  <div class="field">
    <%= f.label :published_at %><br>

    <%= f.text_field :published_at_date, :size => 10, :maxlength => 10 %>
    <%= f.text_field :published_at_time, :size => 5, :maxlength => 5 %>
  </div>
  ....
<% end %>

这会根据需要显示2个文本框,但是,如果我修改日期/时间,新创建的帖子将忽略这些文本并将published_at,published_at_date和published_at_time设置为当前日期时间。

我做错了什么,如何解决这个问题?

enter image description here

1 个答案:

答案 0 :(得分:0)

您在Post模型中没有验证,因此可能会跳过回调before_validation。试试before_save

此外,我建议在set_datetimes方法中将String转换为DateTime:

def set_datetimes
  self.published_at = DateTime.new("#{self.published_at_date} #{self.published_at_time}:00")
end