通过put方法通过rails form_tag上的按钮发送参数



我有两个链接(如果需要的话,可以是按钮),说接受和拒绝,我需要通过单击其中一个链接来向我的控制器操作发送True或False参数。我不希望我的参数在URL中可见,因此我需要使用put方法。我已经尝试使用定义方法的link_to:

<%= link_to 'accept', { action: 'accept_offer', accept: true }, method: :put %>
<%= link_to 'decline', { action: 'accept_offer', accept: false }, method: :put %>

但我的参数仍然可见。

我尝试使用button_to,但是我的参数未传递。确定在不显示URL参数的情况下选择哪种选项(接受或拒绝)的最佳方法是什么?

我的路线已被这样定义:

put 'offers', to: 'offers#accept_offer'

我建议制作一个表单,而不是link_to并以名称传递params。使用表格并发布信息。这可能需要在源页面中的其他代码,但不需要目标页面中的逻辑更改。

<% form_for @offer, :url => {:action => 'accept_offer'} do |f|%>
  <%= submit_tag "", :value => "Accept", :name => "accept" %>
  <%= submit_tag "", :value => "Decline", :name => "decline"  %>
<% end %>

在您的操作中,您会根据单击的链接获得params [:cackect]或params [:dew]。

编辑为包括提交标签上的关键字参数的逗号和空格。]

以常规路线开始:

resources :offers

然后让我们使用button_to创建一个离散表单:

<%= button_to 'accept', @offer, method: :patch, params: { "offer[accept]" =>  true } %>
<%= button_to 'decline', @offer, method: :patch, params: { "offer[accept]" => false } %>

params选项在表单内创建隐藏的输入。

然后确保您白名单正确的属性:

class OffersController < ApplicationController
  def update
    @offer = Offer.find(params[:id])
    if @offer.update(offer_params)
      redirect_to @offer, success: 'Offer updated'
    else
      render :new
    end
  end
  def offer_params
     params.require(:offer).permit(:accept, :foo, :bar)
  end
end

如果您需要与常规更新具有单独的逻辑,请创建两个其他动词:

resources :offers do
  member do
    patch :accept
    patch :decline
  end
end

<%= button_to 'accept', accept_offer_path(@offer), method: :patch %>
<%= button_to 'decline', decline_offer_path(@offer), method: :patch %>

这可以使您的API恢复和降低。

相关内容

  • 没有找到相关文章

最新更新