我一直在寻找解决方案已经有一段时间了,但我无法解决如何解决这个问题。我是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
答案 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]
,在您的网址参数中定义。