我有一个表单来创建一个新任务。在表单内,用户可以选择之前使用其他表单添加的客户端。我想让用户“动态”添加新客户端。这是我到目前为止所尝试过的。
在我看来,我有一个collection_select
来显示当前的客户端。然后我使用一点jQuery将新元素添加到此列表“Add another ...”。选择此选项后,选择菜单将替换为文本字段,用户可在其中输入新客户名称:
<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>
这将创建一个名为“client_name”的新参数。在我的任务模型中,我为client_name添加了attr_accessor
,这样它就不会是“未知属性”。
然后在我的控制器中,我有以下代码:
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
在调用@task.save
之前将client_id添加到params哈希,但事实并非如此。通过在调用fail
之前添加@task.save
来确认这一点。
如何在保存之前将“client_id”插入params哈希?我也尝试过这样的合并:Rails 4: Insert Attribute Into Params,但无法使其工作。
答案 0 :(得分:1)
只需将client_id
添加到验证其存在的任何对象中。如果@task
需要client_id
,请在致电@task.client_id = c.id
之前指定@task.save
。