我正在学习RoR并尝试将为脚手架生成的日期时间字段生成的默认5下拉列表控件替换为两个文本框,一个用于日期,另一个用于时间。
在我的示例中,我运行以下命令来生成Posts资源:
rails g scaffold post name:string content:text published_at:datetime
到目前为止,我做了以下更改:
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设置为当前日期时间。
我做错了什么,如何解决这个问题?
答案 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