【问题标题】:Sending parameters through button on rails form_tag with put method使用 put 方法通过 rails form_tag 上的按钮发送参数
【发布时间】:2017-07-04 18:14:36
【问题描述】:

我有两个链接(如果需要,可以是按钮)表示接受和拒绝,我需要通过单击其中一个链接将真或假参数发送到我的控制器操作。我不希望我的参数在 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'

【问题讨论】:

    标签: ruby-on-rails parameter-passing put link-to button-to


    【解决方案1】:

    我建议制作一个表单而不是 link_to 并在名称中传递参数。使用表单并发布信息。这可能需要在源页面中添加额外代码,但不需要在目标页面中更改逻辑。

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

    在您的操作中,您将根据您点击的链接获得 params[:accept] 或 params[:decline]。

    修改为在提交标签上包含逗号和空格以及关键字参数。]

    【讨论】:

    • 因为我只需要将参数传递给控制器​​操作以确定操作流程,因此我设法将您的建议与 form_tag 内的 submit_tag 一起使用,并使用我的操作和 put 方法。谢谢
    【解决方案2】:

    从常规路线开始:

    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 保持安静且具有描述性。

    【讨论】:

      猜你喜欢
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 2011-04-29
      相关资源
      最近更新 更多