我正在为Shopify创建一个公共的嵌入式应用程序,其目标很简单:检索缺货的产品列表,并为所有者提供删除它们的选项。我正在发出API请求,以查找缺货的产品,效果很好。虽然当我尝试删除产品时,我得到的是“无法验证CSRF ...”
我正在运行Rails 5.2.3和ruby 2.5.0,我尝试使用其他版本的rails,确保我的布局中有<%csrf meta ...%>,并且该应用程序具有'write_products '授权URL中的权限。
我是Rails的新手,所以我希望这是我犯的一个简单错误的结果。
这是我的路线。rb:
Rails.application.routes.draw do
root :to => 'home#index'
mount ShopifyApp::Engine, at: '/'
post '/destroy', to: 'home#destroy'
end
home_controller:
class HomeController < AuthenticatedController
def index
@products = ShopifyAPI::Product.find(:all, params: { limit: 10 })
@webhooks = ShopifyAPI::Webhook.find(:all)
end
def destroy
params[:product_ids].each do |product_id|
puts product_id
ShopifyAPI::Product.delete(product_id)
end
end
end
和发送帖子请求的HTML表单:
<form action="destroy" method="post">
<% @products.each do |product| %>
<% if product.variants.all? { |variant| variant.inventory_quantity == 0 } %>
<input type="checkbox" name="product_ids[]" value="<%=product.id%>"><%= product.title %></input>
<% end %>
<% end %>
<button type="submit">delete products</button>
</form>
POST表单将选定的product_id发送到销毁路径,这将进行API调用以删除每个产品。
相关的Heroku日志输出为:
2019-06-01T16:47:00.028409+00:00 app[web.1]: I, [2019-06-01T16:47:00.028316 #4] INFO -- : [f88f9c69-7c6c-4a31-a386-f6916c295700] Started POST "/destroy" for 24.96.97.148 at 2019-06-01 16:47:00 +0000
2019-06-01T16:47:00.029561+00:00 app[web.1]: I, [2019-06-01T16:47:00.029496 #4] INFO -- : [f88f9c69-7c6c-4a31-a386-f6916c295700] Processing by HomeController#destroy as HTML
2019-06-01T16:47:00.029628+00:00 app[web.1]: I, [2019-06-01T16:47:00.029573 #4] INFO -- : [f88f9c69-7c6c-4a31-a386-f6916c295700] Parameters: {"product_ids"=>["1594488094775"]}
2019-06-01T16:47:00.029867+00:00 app[web.1]: W, [2019-06-01T16:47:00.029808 #4] WARN -- : [f88f9c69-7c6c-4a31-a386-f6916c295700] Can't verify CSRF token authenticity.
编辑:
我将路线更新为:
post '/home', to: 'home#destroy'
并使用form_tag
方法创建我的表单,该表单为表单添加了真实性:
<%= form_tag(home_path) do %>
<% @products.each do |product| %>
<% if product.variants.all? { |variant| variant.inventory_quantity == 0 } %>
<input type="checkbox" name="product_ids[]" value="<%=product.id%>"><%= product.title %></input>
<% end %>
<% end %>
<button type="submit">delete products</button>
<% end %>
</form>
它解决了我的问题。
答案 0 :(得分:0)
我认为您忘记了csrf_meta_tag中的=
。
<%= csrf_meta_tag %>
<%=
指示命令的输出应打印到html,而<%
只是不打印到html的操作。