2014-10-09 3 views
0

У меня есть контроллер со следующими методамиизменение параметров в контроллере рельсы

def create 
    @todo = Event.new(event_params) 
    ... 
end 

def event_params 
    form_params = [:title, :type, :owner_id, :note, :occurred, :due] 
    form_params[:due].strftime!("%Y-%m-%d") 
    params.permit(form_params) 
end 

я обнаружил, что, когда я пост дату (: из-за или: произошло) к способу создания с форматом дд/мм/yyyy вместо dd/mm/yyyy Я получаю аргумент вне диапазона для такой даты, как 10/30/2014. Поэтому я пытаюсь преобразовать значения даты в параметры до вызова Event.new

Линия - form_params [: due] .strftime! («% Y-% m-% d») - не работает и после довольно большого количества поисковых запросов, я не могу понять, как правильно изменить значение параметра. Ошибка, которую я получаю в настоящее время для этой строки, - это «неявное преобразование символа в Integer». Как я могу это сделать? Благодарю.

ответ

1

Ну, давайте рассмотрим каждую строку кода, чтобы понять, где ошибка.

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 

Это должно сделать две вещи:

  1. Заменить пользователя due с форматом соответствующей даты
  2. Разрешить перечислимые ключи для массового назначения для вашего объекта

И остальная часть кода должна нормально работать с этой коррекции:

def create 
    @todo = Event.new(event_params) 
    ... 

Однако остерегайтесь побочных эффектов:

  1. Использование event_params ограничивает вас от фактического ввода %m/%d/%Y пользователя в настоящее время.
  2. Malefactor сможет передать некоторую строку, не подлежащую анализу, вместо %m/%d/%Y отформатированной даты, и это закончится ошибкой во время выполнения.
+0

Спасибо за объяснение. Однако, когда я оставляю метод event_params не изменять значение и вместо этого делаю это после Event.new, как вы показали, я снова получаю аргумент вне диапазона ошибки на этой строке, поэтому он никогда не переходит к следующей строке, чтобы изменить значение , Если я сделаю это с помощью strftime в методе event_params, я получаю ошибку, о которой я упоминал выше, - undefined method 'strftime! ' для "10/29/2014": String. Есть ли обычный способ, чтобы ваш контроллер принимал даты в формате mm/dd/yyyy без необходимости перескакивать через эти обручи? –

+0

@geoffswartz Я отредактировал ответ, чтобы включить ссылку на [тема конверсии по дате] (http://stackoverflow.com/questions/17563048/parse-a-date-in-rails), пожалуйста, проверьте это. – twonegatives

+0

Еще раз спасибо. Основываясь на статье, она «звучит» как params ["due"] = Date.parse (params ["due"]) должна работать. Но я получаю неверную ошибку даты, и я подтвердил, что передаю строку «10/30/2014». Я не понимаю, как это работать? Еще раз спасибо за помощь! –

1

Вы назначаете form_params массив символов, и вы не можете ссылаться на элемент массива по символу, таким образом, свою ошибку. Вероятно, вы хотите, чтобы это выглядело так:

form_params = params.permit(:title, :type, :owner_id, :note, :occurred, :due) 

, который предоставит вам хэш, который вы ищете.

Редактировать: сначала я не проверял манипуляции с датами, которые вы пытались сделать. Вам нужно будет использовать Date.strptime, чтобы преобразовать вашу строку в дату, но вам нужно знать формат даты. К сожалению, вы не можете точно догадаться об этом. Если вы знаете, дата будет мм/дд/гггг, вы можете конвертировать форматы, как это:

params[:due] = Date.strptime(params[:due], '%m/%d/%Y').strftime("%Y-%m-%d") 
+0

ок, спасибо, что заставляет меня дальше. так далее к следующей проблеме. как преобразовать его в правильный формат даты? когда я использую то, что у меня выше, я получаю эту ошибку - неопределенный метод 'strftime! ' for "10/29/2014": String –

+0

Ahh ... strftime - это функция Date, а не строковая функция. Я отредактировал свой ответ, чтобы показать, как сделать такое преобразование. – Jim

0

супер поздно к игре, но вы можете рассмотреть вопрос об использовании этого драгоценного камня: github.com/launchpadlab/decanter

Это позволяет легко определить, как входящие PARAMS должны быть разобраны.

Подробнее об этом здесь: https://medium.com/launchpad-lab/the-missing-step-in-rails-controllers-82aaa9172165

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