Неопределенный метод «paypal_url» из частичного

Всем добрый вечер,

Я пытался решить это какое-то время, я уверен, что это что-то очень простое, чего мне не хватает...

В настоящее время у меня есть интернет-магазин, он позволяет покупателям добавлять товары в корзину, которая затем позволяет покупателям платить через PayPal.

Нет проблем, если я попытаюсь заплатить «изнутри» корзины, E.G.

http://localhost:3000/carts/1

Тем не менее, я создал частичное отображение всех элементов корзины (это частичное отображение в раскрывающемся списке на панели навигации), и в этом раскрывающемся списке покупатель должен иметь возможность щелкнуть «оформить заказ». С целью, чтобы он работал так же, как и в тележке; это должно привести их прямо к PayPal для оплаты. Этот частичный ниже.

_display_cart.htlm.erb

<% current_cart.line_items.each do |item| %>
 <li> <%= item.product.title %>  
 <%=  number_to_currency item.product.price , :unit =>"&pound" %> &times; <%= item.quantity %> </li>
<% end %>

<div align="right">
 <%= number_to_currency(current_cart.grand_total,  :unit => "&pound;") %>&nbsp;
</div>
 </ul>
<%= link_to "Checkout", @cart.paypal_url(products_url) %>

Если я добавляю товар в корзину со страницы отображения продуктов, в то время как следующее:

<%= link_to "Checkout", @cart.paypal_url(products_url) %> 

Я получаю ошибку неопределенного метода:

undefined method `paypal_url' for nil:NilClass

Тем не менее, paypal_url определяется в cart.rb следующим образом.

    def paypal_url(return_url)
values = {
:business => 'EMAIL',
:upload => 1,
:return => return_url,
:invoice => id
}
line_items.each_with_index do |item, index|
values.merge!({
  "amount_#{index+1}" => item.product.price,
  "item_name_#{index+1}" => item.product.title,
  "item_number_#{index+1}" => item.id,
  "quantity_#{index+1}" => item.quantity
})
end
"https://www.sandbox.paypal.com/cgi-bin/webscr?" + values.to_query
end

Интересно, что если я зайду на localhost:3000/carts/1, выпадающий список из моей панели навигации работает отлично, и ошибка больше не блокирует мой путь к сайту. Кнопка оформления заказа в раскрывающемся меню панели навигации приводит меня к PayPal, как и должно быть; это просто не делается на остальной части сайта, только в представлениях корзины (только показ, а не индекс).

Пожалуйста, простите меня, если это будет так просто, как я полагаю, прошло несколько месяцев с тех пор, как я играл с рельсами, и с самого начала я был не так хорош!


person Ben Murphy    schedule 08.04.2014    source источник


Ответы (1)


Вы получаете сообщение об ошибке, потому что @cart не установлено. В настоящее время его значение равно нулю в частичном _display_cart.html.erb. Убедитесь, что вы установили значение @cart перед рендерингом этого фрагмента.

Например:

Установите значение @cart в действии, которое отображает всю страницу (внутри которой вы визуализируете частичную).

Передайте @cart через locals при рендеринге партиала:

<%= render :partial => 'display_cart', :locals => {:cart => @cart} %>

а в частичном доступе это как cart вместо @cart.

ОБНОВЛЕНИЕ

ОП хотел проверить текущее содержимое корзины, которое у него уже есть в current_cart.

Просто обновите ссылку

<%= link_to "Checkout", @cart.paypal_url(products_url) %>

To

<%= link_to "Checkout", current_cart.paypal_url(products_url) %>
person Kirti Thorat    schedule 08.04.2014
comment
Привет, спасибо за ваш ответ, но я точно не знаю, как это сделать, мозг сегодня находится в «сумасшедшем» режиме. Кроме того, я следил за всем на stackoverflow.com/questions/1850905/ думал, что это поможет, но безрезультатно. Еще раз спасибо, Бен. - person Ben Murphy; 09.04.2014
comment
Привет еще раз, спасибо за ваш быстрый ответ. Я пробовал что-то подобное раньше (хотя я не знал, что @ внутри частичного). Однако это по-прежнему приводит к неопределенному методу `paypal_url' для nil:NilClass, так что я понятия не имею, в чем проблема! - person Ben Murphy; 09.04.2014
comment
`Я не знал, что нужно убрать @ внутри партиала`: Просто замените @cart на cart в _display_cart.html.erb файле. - person Kirti Thorat; 09.04.2014
comment
Да, я сделал это, я имею в виду сообщение, которое я ранее читал, не говорил об этом, однако я сделал это, как вы сказали, но безрезультатно. Извините, если я был неясен. _navigation.html.erb теперь говорит: <%= render :partial => '/display_cart', :locals => {:cart => @cart} %> и _display_cart.html.erb говорит <%= link_to "Checkout", cart.paypal_url(products_url) %> - person Ben Murphy; 09.04.2014
comment
Где вы устанавливаете переменную @cart? Поделитесь кодом контроллера, который отображает главную страницу (в которой вы визуализируете частичный _display_cart.html.erb). - person Kirti Thorat; 09.04.2014
comment
Партиал отображается на всех страницах, так как он является частью самой панели навигации. Application.html.erb отображает партиал _navigation; в _navigation.html.erb есть часть, которая добавляет корзину на панель навигации в виде раскрывающегося списка. Я предполагал, что рендеринг частичного набора переменной @cart. Из-за этого я не уверен, что добавить в контроллер? (Я предполагаю, что он должен быть во всех контроллерах?) Я думал, что частичный рендеринг установит переменную. Извиняюсь за недостаток знаний по этому поводу. - person Ben Murphy; 09.04.2014
comment
Да, теперь вы у цели. Вам нужно будет установить @cart на уровне приложения. Пожалуйста, примите ответ, когда у вас будет шанс. - person Kirti Thorat; 09.04.2014
comment
Привет еще раз, я попытался установить его в контроллере приложений, после некоторых исследований на различных веб-сайтах я установил before_filter :load_carts и def load_carts @carts = Cart.all end, но все равно ничего! Что я делаю неправильно?! :/ - person Ben Murphy; 09.04.2014
comment
Точно! Ты герой, часами ломал мне голову над этим. Большое спасибо. - person Ben Murphy; 09.04.2014