Rails 4 - 保存前更改参数

时间:2015-06-24 17:05:08

标签: ruby-on-rails ruby-on-rails-4

我有一个表单来创建一个新任务。在表单内,用户可以选择之前使用其他表单添加的客户端。我想让用户“动态”添加新客户端。这是我到目前为止所尝试过的。

在我看来,我有一个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,但无法使其工作。

1 个答案:

答案 0 :(得分:1)

只需将client_id添加到验证其存在的任何对象中。如果@task需要client_id,请在致电@task.client_id = c.id之前指定@task.save