Подтвердить что ты не робот

Rails 3 дата выбора даты jquery не сохраняется в базе данных

Когда я отправляю свою форму, я могу видеть дату отправки в сообщение. Однако он не сохраняет дату. Если я проведу проверку даты, она говорит, что она не в правильном формате. Вот моя функция выбора даты, она отображает штраф:

    $j(function(){
    $j("#mile_date").datepicker();
});

$j - это потому, что я использую прототип, так что все вызовы jquery используют переменную noconflict.

Вот сообщение:

 Parameters: {"utf8"=>"Γ£ô", "authenticity_token"=>"Fj4HW/B4EOan/vcPZLJ75TvWkRH4ZKSFsPLlQLSD0cI=", "mile"=>{"odometer"=>"", "trip"=>"428.2
", "gallons"=>"24.959", "note"=>"", "temperature"=>"", "date"=>"06/22/2011"}, "commit"=>"Create Mile"}

Таким образом, он отправляет дату точно, но рельсы, похоже, не похожи на формат. Он вставляет нулевое значение в базу данных. Если я отправлю его с полем даты по умолчанию с раскрывающимися списками, он отправит его и сохранит штраф:

    Parameters: {"utf8"=>"Γ£ô", "authenticity_token"=>"Fj4HW/B4EOan/vcPZLJ75TvWkRH4ZKSFsPLlQLSD0cI=", "mile"=>{"odometer"=>"", "trip"=>"428.2
", "gallons"=>"24.959", "mpg"=>"17.156136063144", "note"=>"", "temperature"=>"", "date(1i)"=>"2011", "date(2i)"=>"6", "date(3i)"=>"22"}, "c
ommit"=>"Create Mile"}

В инструкции insert она вставляет дату как: '2011-06-22'

Rails ожидает, что дата в 3-х переменных будет правильно строить формат даты? Как я могу заставить datepicker отправить правильный формат даты?

Заранее спасибо,

4b9b3361

Ответ 1

Я столкнулся с той же проблемой. Одним из решений является просто изменить формат, используемый datepicker:

// in your javascript...
$j(function(){
  $j("#mile_date").datepicker({
    dateFormat: "yy-mm-dd"
  });
});

Rails, похоже, способен обрабатывать формат yy-mm-dd - я использую это, и у меня нет проблем с сохранением даты в базе данных. Единственная проблема здесь в том, что некоторые могут найти формат yy-mm-dd немного менее привлекательным, чем mm/dd/yyyy...

Ответ 2

Как отмечено @BaronVonBraun выше rails, похоже, не обрабатывает этот формат. Смена его, как он предложил, работал. Однако для тех, кто хочет разного формата, чем yy-mm-dd, вы можете использовать следующее. Пользователь видит желаемый формат, в то время как рельсы получают необходимый формат.

$j(function(){
    $j("#show_date").datepicker({altField: '#mile_date', altFormat: 'yy-mm-dd'});
});

show_date - это идентификатор поля, которое они видят, и поле mile_date является скрытым полем с рельсами дат.

Вот документация.

Ответ 3

Если кто-то использует jquery_datepicker gem, вы захотите использовать что-то похожее на следующий код в вашем представлении rails.

<%= form.hidden_field(:ship_date, :id => "ship_date") %>   
<%= datepicker_input(:show_date, item.id, :size => 10, altField: "#ship_date", altFormat: 'yy-mm-dd', :value => item.ship_date.strftime("%m/%d/%Y"))%>

Вы также можете использовать form.datepicker_input, чтобы прикрепить сборщик дат непосредственно к форме, но в моем случае я хотел, чтобы выбор даты отображал локализованную дату, которую Rails не принимал. Поэтому я добавил элемент скрытой формы и задал ему альтернативное поле, отлично работает!

Ответ 5

j('.jquery-calendar').datepicker().each(function(){
  // convert dates from db to US format
  var $input = j(this)
  var found = $input.val().match(/^(\d{4})-(\d{2})-(\d{2})$/);
  if(found){
    $input.val(found[2]+'/'+found[3]+'/'+found[1]);
  }
});

Ответ 6

Своего рода взломать, но сделал помощником все вещи прямо, когда я знаю, что даю даты сервера в формате mm-dd-yy.

def convert_to_y_m_d(date)
  new_date = date.split("-")[2] + "-" + date.split("-")[0] + "-" + date.split("-")[1]
  new_date
end