我有一个商店应用程序和另一个特殊促销网站。我已经使用Active Resource将商店中的产品导入到促销网站,并添加了购物车来添加产品。但是,要实际订购产品,我需要将商品发送到商店应用程序,在那里创建一个新购物车来完成订单。
我已经制作了一个演示'RESTful'应用程序来练习使用xml来回发送数据,所以我试图将REST的原理用于真正的应用程序。但是,我需要将产品发送到非RESTful控制器。只是为了让您了解商店中的推车控制器,以下是其行动:
def index…
def add…
def checkout…
def update…
def remove…
def empty…
def apply_discount…
def remove_discount…
def apply_credits…
def remove_credits…
def stock_check…
# My action to accept items from carts in other apps
def cart_import…
在routes.rb
中,与购物车相关的唯一路线目前是
map.cart 'cart/:action/:id', :controller => 'shop/cart'
我从以前的开发人员那里继承了商店应用程序,所以如果我是从头开始做的话,我可能会尝试使其更加RESTful。
无论如何,即使没有使用map.resources
定义,我也非常有信心可以让购物车响应XML。我的问题是如何从促销应用程序发送购物车项目和数量的哈希值。
要将购物车项目和数量分组,我已将商品的产品ID和数量收集到散列中:
<% @items = Hash.new %>
<% @cart.items.collect {|i| @items[i.product_id] = i.quantity} %>
在检查时会给出以下输出:
<%= Rails.logger.info @items.inspect %>
{1144=>2, 1143=>1}
所以我想将它们发送到我可以通过发布的link_to
传递给他们的商店:
<%= link_to 'Export Cart', "http://shop.example.com/cart/cart_import", :items => @items, :method => :post %>
这似乎没有做任何事情,而省略第一个字段以一种看起来合理的格式将项目附加到URL,但在促销应用程序中显示为相对链接:
<%= link_to "http://shop.example.com/cart/cart_import", :items => @items, :method => :post %>
http://promo.example.com/cart?items[1143]=1&items[1144]=2&method=post
我确定线索是因为@items
对象需要传入url,但由于我不能使用命名路由,所以我真的不知道如何在那里获取它以便以正确的格式发布。
感谢您的帮助,
加雷
答案 0 :(得分:0)
传递link_to方法的参数的方式是假设:items是link_to选项之一,而不是url选项之一。这是一个优先级问题的顺序,如果你将你的url包装在parens中,那么你可以使用url上url_for方法的可用选项来构建路径:http://apidock.com/rails/ActionView/Helpers/UrlHelper/url_for
答案 1 :(得分:0)
您无法使用链接生成POST请求。它正转向GET请求。更好地使用javascript来点击按钮或其他事件来生成帖子请求。
答案 2 :(得分:0)
最后我做了一个帮手:
def hash_to_params(items)
result = ""
i = 0
items.each do |item|
i > 0 ? result += "&" : result += ""
result += "items[#{item[0]}]=#{item[1]}"
i += 1
end
return result
end
然后,对于我称为帮助者的链接:
<%= link_to "export", "http://shop.example.com/cart/cart_import?#{hash_to_params(@items)}", :method => :post %>
非常难看的做法,但我真的想不出更好的东西?
干杯,
加雷