[英]Rails DateTime field has current date/time if nil in the database
[英]Rails - :date and :time columns show nil value
我是Rails的新手,并且已经将前端项目移到了Rails环境。 我已经用start_date,end_date和start_time列设置了一个表单。 start_date和end_date的列类型为:date,start_time的列类型为:time。 我正在使用日期选择器选择日期,并使用时间选择器选择时间。 我同时接收日期和时间的格式是:
Wed Jan 11 2017 13:31:14 GMT+0530
我已使用moment js格式化输出,以向用户显示更易理解的日期和时间格式。
moment().format('LL'); //January 23,2017
moment().format('LTS'); //1:17:54 PM
提交表单时,日期和时间列为零。
我已经读过我应该使用Date.parse()和Time.parse()或strftime来转换日期。
我有两个问题:1.转换代码应该放在哪里? 凭直觉,我认为在获取输入本身时,它应该在控制器中,或者应该在视图中。 2.:date和:time列接受什么格式?
我有sqlite 3作为ActiveRecord的数据库,并且我正在使用Rails 5.0.1。
home.new.html.erb(三栏类型的表单字段):
<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
<%= f.text_field :start_date,:class => "mdl-textfield__input"%>
<label class="mdl-textfield__label" for="home_start_date" id="start-date-label">Enter start date</label>
</div>
<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
<%= f.text_field :end_date,:class => "mdl-textfield__input"%>
<label class="mdl-textfield__label" for="home_end_date" id="end-date-label">Enter end date</label>
</div>
<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
<%= f.text_field :start_time,:class => "mdl-textfield__input"%>
<label class="mdl-textfield__label" for="home_start_time" id="start-time-label">Enter time</label>
</div>
home_controller.rb
class HomeController < ApplicationController
def index
@campaigns = Home.all
end
def new
@home = Home.new
end
def show
@campaign = Home.find(params[:id])
end
def create
home_params = params.require(:home).permit(:campaign_name,:phone_number_receiver,:start_date,:end_date,:start_time,:sms_msg)
@home = Home.new(home_params)
@home.save
end
end
链接到github: https : //github.com/rimildeyjsr/sms-scheduler
您应该在控制器中处理数据-或者要处理大量数据,或者处理规则很复杂:让控制器将处理交给专用的数据处理对象。
我建议像这样修改您的控制器代码:
def create
@home = Home.create(home_params)
end
private
def home_params
home_params = params.require(:home).permit(
:campaign_name, :phone_number_receiver, :start_date, :end_date,
:start_time, :sms_msg
).tap do |attr|
attr[:start_date] = Date.parse(attr[:start_date])
attr[:end_date] = Date.parse(attr[:end_date])
attr[:start_time] = Time.parse(attr[:start_time])
end
end
tap
可以让你步入params
哈希值,因为它正在通过处理require
,并修改它的内容。
如果处理很复杂,则可以执行以下操作:
def home_params
home_params = params.require(:home).permit(
:campaign_name, :phone_number_receiver, :start_date, :end_date,
:start_time, :sms_msg
).tap do |attr|
ParamsProcessor.modify attr
end
end
其中ParamsProcessor
是您创建的用于处理处理的对象。 例如:
module ParamsProcessor
def self.modify(hash)
hash.each do |key, value|
hash[key] = Date.parse(value) if /_date$/ =~ key && value.present?
hash[key] = Time.parse(value) if /_time$/ =~ key && value.present?
end
end
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.