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 отправить правильный формат даты?
Заранее спасибо,
Ответы
Ответ 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 не принимал. Поэтому я добавил элемент скрытой формы и задал ему альтернативное поле, отлично работает!
Ответ 4
Или попробуйте камень делокализации: https://github.com/clemens/delocalize
Ответ 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