2015-06-26 3 views
0

У меня небольшая форма, в которой есть поле даты, где я пытаюсь сохранить в базе данных. Все остальные поля сохраняются за исключением поля даты с datepicker. вид и контроллерПоле даты выбора даты загрузки, не сохраняющееся в mysql db

def addreminder 
@user = set_user 

@userremind=UserReminder.new do |u| 
    u.user_id=params[:id] 
    u.car_id=params[:car] 
    u.reminder=Time.local(params[:reminder_date]).strftime('%Y/%d/%m') 
    u.service_type=params[:service_type] 
    u.active_status=0 
end 

Показать вид

<%= form_tag("https://stackoverflow.com/users/addreminder/#{current_user.id}",:method=>"post",:id => 'add_reminder') do %> 
    <%= select_tag(:car, options_for_select(@cars.collect{|u|[u['car_name'],u['id']]}), 
     {class: "span3 input-md main_select"}) %> 
     <%= label :service_type,"Select Service Type"%> 
     <%= select_tag(:service_type, options_for_select(@services.collect{|u|[u['service_type'],u['service_type']]}), 
     {class: "span3 input-md main_select"}) %>  
<%= (text_field_tag :reminder_date,nil,placeholder: "Select Reminder Date",data: {provide: "datepicker"})%>  
     <%= submit_tag "Remind me",:class=>"btn btn-xlarge"%> 
         <% end %> 
     <script> 

    $(document).ready(function(){ 
$('.datepicker').datepicker(); 
    }); 
</script> 

Вот журнал PARAMS

Parameters:   {"utf8"=>"✓""authenticity_token"=>"7wSEVk24GAgpMtIYoEsa195DYsqB4UsOQ6BoAMzgOfc=", "car"=>"27", "service_type"=>"Oil Change", "reminder_date"=>"07/02/2015", "commit"=>"Remind me", "id"=>"5"} 
User Load (0.4ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 5 ORDER BY `users`.`id` ASC LIMIT 1 
User Load (0.2ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = ? LIMIT 1 [["id", "5"]] 
SQL (0.1ms) BEGIN 
SQL (0.4ms) INSERT INTO `user_reminders` (`active_status`, `car_id`, `created_at`, `service_type`, `updated_at`, `user_id`) VALUES (?, ?, ?, ?, ?, ?) [["active_status", 0], ["car_id", 27], ["created_at", Fri, 26 Jun 2015 19:52:10 UTC +00:00], ["service_type", "Oil Change"], ["updated_at", Fri, 26 Jun 2015 19:52:10 UTC +00:00], ["user_id", 5]] 
(32.8ms) COMMIT 

Схема базы данных:

CREATE TABLE user_reminders ( 
    id int(11) NOT NULL AUTO_INCREMENT, user_id int(11) DEFAULT NULL, 
    car_id int(11) DEFAULT NULL, 
    service_type varchar(255) DEFAULT NULL, 
    reminder varchar(25) DEFAULT NULL, 
    active_status int(1) NOT NULL DEFAULT '1', 
    created_at datetime DEFAULT NULL, 
    updated_at datetime DEFAULT NULL, 
    PRIMARY KEY (id)) ENGINE=InnoDB AUTO_INCREMENT=56 DEFAULT CHARSET=utf8 

Модель:

class UserReminder < ActiveRecord::Base 
    belongs_to :user 
    attr_accessor :reminder 
    validates :reminder, presence: true 
    # validate :reminder_date_cannot_be_in_the_past 

    def reminder_date_cannot_be_in_the_past 
    errors.add(:reminder, "Can't be in the past") if reminder_date <= Date.today.strftime('%m/%d/%Y') 
    end 
end 
+0

В таблице «user_reminders» есть столбец «напоминание»? –

+1

Вы добавили 'reminder_date' в список разрешенных аргументов в вашем контроллере? – spickermann

+0

@WallyAltman, да она имеет столбец называется напоминание – user501307

ответ

1

Есть несколько проблем с этим не работает:

Первые:attr_accessor :reminder линии наслаивается сеттер и геттер, что Rails уже обеспечивает колонку reminder. В результате вы не можете установить значения на «реальные» reminder. Удалите строку attr_accessor :reminder из вашей модели.

Второй:Time.local не может разобрать строку из параметров.

Time.local('07/02/2015').strftime('%Y/%d/%m') 
#=> "0007/01/01" 

Time.parse Используйте вместо этого:

Time.parse('07/02/2015').strftime('%Y/%d/%m') 
#=> "2015/07/02" 

Третье: Пользовательские валидатор пытается сравнить две разные вещи. reminder_date не существует, а Date.today.strftime('%m/%d/%Y') имеет другой формат, отличный от сохраненного в текстовом столбце. Изменить этот метод к:

def reminder_date_cannot_be_in_the_past 
    if reminder <= Date.today.strftime('%Y/%d/%m') 
    errors.add(:reminder, "can't be in the past") 
    end 
end 

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

ИМО имеет смысл изменить тип столбца reminderDATE. Это сделало бы код намного проще, потому что тогда вы могли бы сравнить объекты Date, и вам понадобятся вызовы методов strftime.

И мне кажется, что вы не справляетесь с ошибками проверки. Может иметь смысл обрабатывать результат вызова save и возвращать ошибки пользователю, если он не работает.

+0

Еще же проблема здесь обновленный контроллер, данные не recorddef addreminder @user = set_user @ userremind = UserReminder.new сделать | у | u.user_id = params [: id] u.car_id = params [: car] u.reminder = Time.parse (params [: reminder_date]). Strftime ('% Y /% d /% m') u.service_type = params [: service_type] u.active_status = 0 end – user501307

+0

Мне действительно не нужно, просто попробуйте разные варианты, позвольте мне попробовать выше – user501307

+0

Нет, это не работает, странная вещь, даже если я жестко кодирую значение, данные не входят. Но все остальные значения получение вставлено – user501307

Смежные вопросы