Ну, давайте рассмотрим каждую строку кода, чтобы понять, где ошибка.
form_params = [:title, :type, :owner_id, :note, :occurred, :due]
Во-первых, вы объявляете массив символов и присвоить этот массив form_params
переменной. Это простой простой массив, а не ассоциативный, поэтому вы можете получить доступ к его значениям только с помощью индексов. form_params[0]
вернет :title
, но form_params[:due]
является ошибкой во время выполнения, так как :due
не является целым индексом. На самом деле, цель event_params
метода должна быть столь же простым, как о том, какие параметры позволяют быть массово присвоены вашим объектам, поэтому он должен выглядеть
params.permit([:title, :type, :owner_id, :note, :occurred, :due])
Получение дальше, ваша цель состоит в том, чтобы изменить параметры, которые пришли с клиентской стороны. По разным форматам форматов даты, пожалуйста, обратитесь к this topic.
Отказ от ответственности: Это может быть гораздо более изящным, чтобы заставить пользователей перейти due
дату в обычном формате %Y-%m-%d
. Пожалуйста, посмотрите на методы rails dates helper.
что параметры находятся в params
хэша, так что вы могли бы переписать соответствующий ключ:
def event_params
params["due"] = Date.strptime(params["due"], "%m/%d/%Y").to_s
# here we've converted date format to standard %Y-%m-%d
params.permit([:title, :type, :owner_id, :note, :occurred, :due])
end
Это должно сделать две вещи:
- Заменить пользователя
due
с форматом соответствующей даты
- Разрешить перечислимые ключи для массового назначения для вашего объекта
И остальная часть кода должна нормально работать с этой коррекции:
def create
@todo = Event.new(event_params)
...
Однако остерегайтесь побочных эффектов:
- Использование
event_params
ограничивает вас от фактического ввода %m/%d/%Y
пользователя в настоящее время.
- Malefactor сможет передать некоторую строку, не подлежащую анализу, вместо
%m/%d/%Y
отформатированной даты, и это закончится ошибкой во время выполнения.
Спасибо за объяснение. Однако, когда я оставляю метод event_params не изменять значение и вместо этого делаю это после Event.new, как вы показали, я снова получаю аргумент вне диапазона ошибки на этой строке, поэтому он никогда не переходит к следующей строке, чтобы изменить значение , Если я сделаю это с помощью strftime в методе event_params, я получаю ошибку, о которой я упоминал выше, - undefined method 'strftime! ' для "10/29/2014": String. Есть ли обычный способ, чтобы ваш контроллер принимал даты в формате mm/dd/yyyy без необходимости перескакивать через эти обручи? –
@geoffswartz Я отредактировал ответ, чтобы включить ссылку на [тема конверсии по дате] (http://stackoverflow.com/questions/17563048/parse-a-date-in-rails), пожалуйста, проверьте это. – twonegatives
Еще раз спасибо. Основываясь на статье, она «звучит» как params ["due"] = Date.parse (params ["due"]) должна работать. Но я получаю неверную ошибку даты, и я подтвердил, что передаю строку «10/30/2014». Я не понимаю, как это работать? Еще раз спасибо за помощь! –