2015-12-05 2 views
0

Я изучаю RoR и пытаюсь заменить элементы управления выпадающим списком по умолчанию, сгенерированные для поля datetime из леса, в два текстовых поля, один для даты и другой для времени.Текстовые поля даты и времени в Rails

В моем примере я выполнить следующую команду, чтобы создать ресурс Сообщений:

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 Textboxes по мере необходимости, однако, если я изменить дату/время, вновь созданные почтовые Игнорирует они и устанавливают publish_at, published_at_date и publish_at_time в текущее время.

Что я делаю неправильно и как я могу это решить?

enter image description here

ответ

0

У вас нет проверки в модели Post поэтому, возможно, обратный вызов before_validation пропускается. Попробуйте с before_save.

Кроме того, я предлагаю, чтобы преобразовать строку в DateTime в set_datetimes метода:

def set_datetimes 
    self.published_at = DateTime.new("#{self.published_at_date} #{self.published_at_time}:00") 
end 
Смежные вопросы