Опубликовать параметры на внешнем сайте с помощью Link_to - PullRequest
1 голос
/ 09 июля 2010

У меня есть приложение для магазина и другой сайт для специальной акции.Я использовал 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, если бы делал его с нуля.

В любом случае, я довольно уверен, что смогузаставить корзину отвечать на XML, даже не будучи определенным с помощью map.resources.Моя проблема заключается в том, как отправить из промо-приложения хэш товаров и их количества в корзине.

Чтобы сгруппировать товары и количества в корзине, я собрал идентификатор продукта и количество товара в хэш:

<% @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, но так как я не могу использоватьименованный маршрут, я не знаю, как его туда доставить, чтобы он был выложен в правильном формате.

Спасибо за помощь,

Гарет

Ответы [ 3 ]

0 голосов
/ 09 июля 2010

Вы не можете использовать ссылку для генерации запроса POST. Это превращается в запрос GET. Лучше использовать JavaScript для генерации запроса на публикацию по нажатию кнопки или по другому событию.

0 голосов
/ 13 июля 2010

В конце я сделал помощника:

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 %>

Довольно уродливый способ сделать это, но я действительно могу 'не придумаете ничего лучшего?

Приветствия,

Гарет

0 голосов
/ 09 июля 2010

способ передачи параметров для метода link_to предполагает, что: items - это одна из опций link_to, а не одна из опций url. Это проблема порядка приоритета, и если вы заключаете свой URL в паренсы, вы можете использовать опции, доступные для метода url_for в вашем URL, чтобы построить путь: http://apidock.com/rails/ActionView/Helpers/UrlHelper/url_for

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...