#ruby-on-rails #postgresql #bootstrap-datepicker
#ruby-on-rails #postgresql #bootstrap-выбор даты
Вопрос:
У меня есть форма, которая использует jQuery datepicker для выбора только месяца и года.
$(".date-input").datepicker({
format: 'mm-yyyy',
startView: "months",
minViewMode: "months"
});
У меня есть база данных PostgreSQL на серверной части со столбцом datetime, в котором хранится эта дата, которая, по-видимому, нуждается в дате в полном формате ‘дд-мм-гггг’, чтобы сохранить ее. При отправке формы на мой контроллер я столкнулся вот с чем:
Experience.update(date_from: '02-2016')
обновляет таблицу нулевым значением для столбца date_from
Итак, вопрос в том, как я могу добавить '01-'
в этот параметр date_from, который я получаю из POST-запроса на контроллере, в качестве строгих параметров.
Комментарии:
1. Я не думаю, что вам нужно что-либо делать с сильными параметрами, вы можете просто изменить значения параметров перед сохранением в действии контроллера.
2. если вы просто хотите сохранить месяц и год в серверной части, я предлагаю использовать другой столбец, поскольку это избавит вас от множества недоразумений. Также во время запроса вам не нужно повторно запускать логику, чтобы извлечь их оба.
3. имеет смысл изменить действие для одной записи .. но я имею дело с has_many вложенными атрибутами.. таким образом, в одном запросе POST будет вложено несколько
Experience
объектов, таких как"experiences_attributes"=> {"0"=> {"id"=>"1", "date_from" => "02-2010"}, {"1"=> {"id"=>"2", "date_from" => "02-2011"} }
Ответ №1:
Используйте формат даты ISO8601 (2016-10-21).
$(".date-input").datepicker({
format: 'yyyy-mm-dd',
startView: "months",
minViewMode: "months"
});
Вы можете проанализировать его с помощью Date.iso8601(str)
или DateTime.iso8601(str)
.
Я бы создал установщик уровня модели, который обрабатывает это:
class Experience < ActiveRecord::Base # or ApplicationRecord
def date_from=(val)
super( val.is_a?(String) ? Date.iso8601(val) : val )
end
end
Это означает, что вам не нужно беспокоиться о параметрах на уровне контроллера. Просто внесите его в белый список, как и любое другое скалярное значение, и пусть ваша модель выполнит всю работу.
Я бы просто сохранил значения как тип ДАТЫ (как первый день месяца). Это дает вам максимальную гибкость при выполнении запросов к БД, а также разумный формат при извлечении записей, так что вам не нужно снова разбирать строку.
Комментарии:
1. ДА.. делать это на модели имеет смысл .. я пробовал это с
before_save
фильтром на модели.. спасибо, что указали метод установки
Ответ №2:
Это не имеет никакого отношения к строгим параметрам. Когда вы получаете данные из серверной части, используя строгие параметры, вы можете получить доступ к информации в контроллере. Вы можете попробовать что-то вроде этого —
def create
datestr = date_params[:datestr]
date = Date.strptime("01-".concat(datestr), "%d-%m-%Y")
Experience.update(date_from: date)
end
private
def date_params
params.require(:dateinfo).permit(:datestr)
end