使用button_to通过实例创建新的has_many

时间:2017-04-25 01:48:09

标签: ruby-on-rails ruby activerecord

我正在尝试使用Rails button_to在我的连接表中创建一个新实例。

我有4个型号(制造商,批次,报价和批发商) - 制造商有多个批次,批次has_many优惠,以及has_many批发商通过优惠。批发商通过优惠提供多种优惠和多批次。

我将给定批次中的“新优惠”视图设置为所有批发商的列表,以便制造商可以单击单个批发商旁边的按钮,该按钮将创建链接该批次的新“优惠”和特定的批发商。

<%= button_to '+', {:controller => "offers", :action => "create", :wholesaler_id => wholesaler.id}, :method=>:post  %>

我在商品控制中的创建方法:

def create
  @offer = Offer.new(offer_params)

  respond_to do |format|
    if @offer.save
      format.html { redirect_to @offer, notice: 'Offer was successfully created.' }
      format.json { render :show, status: :created, location: @offer }
    else
      format.html { render :new }
      format.json { render json: @offer.errors, status: :unprocessable_entity }
    end
  end
end

商品控制中的我的offer_params方法:

def offer_params
  params.require(:offer).permit(:batch_id, :wholesaler_id, :amount, :accepted, :ignored)
end

当我尝试点击添加按钮时出现错误 -

ActionController::ParameterMissing in OffersController#create
param is missing or the value is empty: offer

指的是offer_params方法。

由于我没有创建优惠,直到我点击按钮我不知道如何/在哪里可以引用它。

感谢您提供任何帮助 - 很高兴发布任何可能有助于回答的其他代码。

完整的“新”视图:

<div id="wrapper">
  <div id="unselected">
    <h2> Wholesalers</h2>
    <table>
      <thead>
      <tr>
        <th> Wholesaler </th>
        <th> Add</th>
      </tr>
      </thead>
      <tbody>
      <% @unselected_wholesalers.each do |wholesaler| %>
          <tr>
            <td><%=wholesaler.name %></td>
            <td><%= button_to '+',
                              {:controller => "offers", :action => "create",
                               :wholesaler_id => wholesaler.id},
                              :method=>:post  %></td>
          </tr>
      <% end %>
      </tbody>
    </table>
  </div>
</div>
<%= link_to 'Back', manufacturer_batches_path(@manufacturer) %>

1 个答案:

答案 0 :(得分:0)

由于require语句,offer_params期待名为offer的对象包含键batch_idwholesaler_id等。这看起来像这样:

{
    offer: {
        batch_id,
        wholesaler_id,
        amount,
        etc.
    }
}

但看起来你的button_to正在发送:

{ 
    batch_id, 
    wholesaler_id, 
    amount, 
    etc.
}

最简单的解决方案是删除require语句,为您提供offer_params这样的内容:

def offer_params
  params.permit(:batch_id, :wholesaler_id, :amount, :accepted, :ignored)
end