2017-01-26 31 views
0

我是rails新手,我已將前端項目移至rails環境。我用start_date,end_date和start_time列設置了一個表單。 start_date和end_date具有列類型:date和start_time具有列類型:time。我正在使用日期選擇器來選擇日期和時間選擇器來選擇時間。在我收到這兩個日期和時間格式爲:Rails - :date和:time列顯示nil值

Wed Jan 11 2017 13:31:14 GMT+0530 

我已經格式化的矩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

回答

2

你應該處理控制器中的數據 - 或者是否有大量數據處理要完成,或者處理規則複雜:控制器是否將處理過程交給專用數據處理對象。

我建議修改你這樣的控制器代碼:

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允許,因爲它正在通過require處理您步入params哈希,並修改它的內容。

如果處理很複雜,你可以這樣做:

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 
+0

我是新來的rails,能否請您提供更詳細的解釋? –

+0

如果您發佈您的控制器代碼,我可以建議如何修改它。 – ReggieB

+0

我用控制器代碼更新了我的問題 –