为什么我的控制器不从表单中获取参数值?

时间:2018-02-12 03:45:49

标签: ruby-on-rails forms controller ruby-on-rails-5 simple-form

我一直在寻找解决方案已经有一段时间了,但我无法解决如何解决这个问题。我是Rails / Ruby编程的新手,并且对这个问题有任何指导。

我有一个接受值并创建Task对象的表单。每个任务 belongs_to 一个潜在客户和潜在客户 has_many 任务。

新任务的路径将lead_id作为参数之一。

/accounts/:account_id/reps/:rep_id/leads/:lead_id/tasks/new

但我的目标是允许用户使用表单为任何潜在客户创建任务。因此,理想情况下,应该允许他从下拉列表中选择一个潜在客户,并且lead_id需要转到CREATE方法。

这是我的表格:

<%= simple_form_for(@task, url: account_rep_lead_tasks_path) do |f| %>
<%= f.error_notification %>

<div class="field">
    <div class="control">
        <div class="select">
        <%= f.collection_select :lead_id, @leads, :id, :name %>
        </div>
    </div>
</div>

<div class="field">
    <div class="control">
        <%= f.input :task_type, required:true, autofocus:true, input_html: {class: "input"}, wrapper: false, label_html: {class: "label"} %>
    </div>
</div>

<div class="field">
    <div class="control">
        <%= f.input :description, required:true, autofocus:true, input_html: {class: "textarea"}, wrapper: false, label_html: {class: "label"} %>
    </div>
</div>

<div class="field">
    <div class="control">
        <%= f.button :submit, class: "button is-primary" %>
    </div>
</div>

默认情况下,我会为最新的潜在客户呈现新的任务表单。假设创建的最新潜在客户的ID为21,这是URL中显示的内容:

http://localhost:3000/accounts/1/reps/2/leads/21/tasks/new

当我提交表单时,即使我通过lead_id表单中的collection_select输入选择了不同的潜在客户,也不会为选定的潜在客户创建任务,而是为id = 21的潜在客户创建任务。

服务器日志显示发送到CREATE方法的参数是:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"sKwctK492JH01yXilEI7jSSmv53ggiJuRBH/9Ate2AS+Lx53CO5BqgIOh44uvhFi6MPJ+Og1EY0U8m2BzqC9eA==", "task"=>{"lead_id"=>"16", "task_type"=>"Hello", "description"=>"Is it me you're looking for?"}, "commit"=>"Create Task", "account_id"=>"1", "rep_id"=>"2", "lead_id"=>"21"}

正如您所看到的,有一个lead_id = 16(这意味着表单正确地输入了输入),但是还存在另一个为其创建任务的lead_id = 21。

我希望为lead_id = 16创建任务。对我应该做什么有什么想法?

这是我的任务创建控制器操作

def create
@account = current_account
@rep = current_account.reps.find(params[:rep_id])
@lead = @rep.leads.find(params[:lead_id])
@task = @lead.tasks.build(new_task_params)
if @task.save
    redirect_to account_rep_lead_task_path(@rep.account_id,@rep.id,@lead.id,@task)
else
    render 'new'
end
end

3 个答案:

答案 0 :(得分:0)

尝试以下代码

def create
  @account = current_account
  @rep = current_account.reps.find(params[:rep_id])
  @lead = @rep.leads.find(params[:task][:lead_id])
  @task = @lead.tasks.build(new_task_params)
  if @task.save
    redirect_to account_rep_lead_task_path(@rep.account_id,@rep.id,@lead.id,@task)
  else
    render 'new'
  end
end

答案 1 :(得分:0)

您会在lead_id哈希下找到params[:task]。喜欢:params[:task][:lead_id]

答案 2 :(得分:0)

您获得了2个不同的lead_id,因为首先,您有lead_id中定义的网址参数routes

/accounts/:account_id/reps/:rep_id/leads/:lead_id/tasks/new

第二,它来自你的形式。因此,如果您想从表单中获取lead_id,可以使用:

params[:task][:lead_id]

否则

params[:lead_id],在您的网址参数中定义。