2015-06-24 6 views
1

У меня есть форма для создания новой задачи. Внутри формы пользователь может выбрать Клиента, который был ранее добавлен с использованием другой формы. Я хотел бы дать пользователю добавить нового клиента «на лету». Вот что я пробовал до сих пор.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, но не смог заставить это работать.

+1

Где вы определяете '@ task' –

ответ

1

Просто добавьте client_id к любому объекту, подтверждающему его существование. Если @task требует client_id, назначьте @task.client_id = c.id перед вызовом @task.save.

+0

Это работает! Не знаю, почему я не думал об этом :-). Благодаря! – Trinculo