繁体   English   中英

Rails-:date和:time列显示零值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM