【问题标题】:Why isn't my controller taking the param value from the form?为什么我的控制器不从表单中获取参数值?
【发布时间】:2018-02-12 03:45:49
【问题描述】:

我一直在寻找解决这个问题的方法已经有一段时间了,但我无法解决如何解决这个问题。我是 Rails/Ruby 编程的新手,希望能在这个问题上提供任何指导。

我有一个表单,它接受值并创建一个 Task 对象。每个任务 belongs_to 一个 Lead 和一个 Lead 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

【问题讨论】:

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


【解决方案1】:

试试下面的代码

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

【讨论】:

    【解决方案2】:

    您会在 params[:task] 哈希下找到 lead_id。点赞:params[:task][:lead_id]

    【讨论】:

      【解决方案3】:

      您将获得 2 个不同的 lead_id,因为首先,您有在 routes 中定义的 url 参数 lead_id

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

      其次,它来自你的表单。所以如果你想从你的表单中获取lead_id,你可以使用:

      params[:task][:lead_id]

      其他

      params[:lead_id] 在您的 URL 参数中定义。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-23
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多