У меня есть форма для создания новой задачи. Внутри формы пользователь может выбрать Клиента, который был ранее добавлен с использованием другой формы. Я хотел бы дать пользователю добавить нового клиента «на лету». Вот что я пробовал до сих пор.Rails 4 - Изменить параметры перед сохранением
На мой взгляд, у меня есть collection_select
для отображения текущих Клиентов. Затем я использую немного jQuery, чтобы добавить новый элемент в этот список «Добавить еще ...». При выборе этой опции меню выбора заменяется текстовым полем, в котором пользователь может ввести имя нового клиента:
<script>
$("#task_client_id").append('<option value=999>Add another...</option>');
$('select[name="task[client_id]"]').change(function() {
if ($(this).val() == "999") {
$("#task_client_id").replaceWith('<input placeholder="Enter new client name" type="text" name="task[client_name]" id="task_client_name">');
}
});
</script>
Это создает новый параметр, называемый «имя_клиентом». В моей модели задач я добавил attr_accessor
для имени client_name, чтобы он не был «Неизвестным атрибутом».
Затем в моем контроллере, у меня есть следующий код:
def create
tp = task_params
if tp[:client_name]
c = Client.create(name: tp[:client_name])
tp[:client_id] = c.id
end
if @task.save
redirect_to new_task_task_detail_path(@task), notice: "Task created successfully!"
else
render :new
end
end
Где task_params
это частный метод для сильных параметров (который включает в себя CLIENT_NAME).
Клиент фактически создается благодаря коду, но форма по-прежнему отображает ошибку из-за моей проверки на client_id, которой нет в хеше params.
Я надеялся, что часть tp[:client_id] = c.id
добавит client_id к хэшу params до вызова @task.save
, но это не так. Это подтверждается добавлением fail
до звонка @task.save
.
Как я могу вставить «client_id» в хэш элемента params до его сохранения? Я также попытался слить следующее: Rails 4: Insert Attribute Into Params, но не смог заставить это работать.
Где вы определяете '@ task' –