Почему переменная контроллера не передается в JavaScript код?

Проблема с передачей данных из контроллера в JavaScript

Пытаюсь использовать JavaScript для перехода на новую страницу при клике по элементу. Вот мой код:

$(document).ready(function() {
    $('.item-block').click( function() {
        window.location.href = '/orders/' + gon.order_item_id;
    });
});

Но получаю такую ошибку:

Couldn't find Order with 'id'=undefined [WHERE "orders"."user_id" = $1]

Вот мой контроллер order_controller.rb:

def show
  @order = current_user.orders.find(params[:id])
  gon.order_item_id = @order.id
end

def index
  @orders = current_user.orders.all
  # как передать id конкретного объекта заказа в gon здесь?
end

Думаю проблема в том как я передаю аргумент URL в метод href. Можете помочь понять что я делаю не так? Сам gon работает нормально, проверял через alert.

Заранее спасибо за помощь!

У тебя смешались два разных метода контроллера. В index ты не устанавливаешь gon.order_item_id, поэтому он undefined. А если установишь - какой именно id из всех заказов? Я бы убрал gon из этой задачи. Просто в каждом блоке заказа добавь атрибут с id прямо в html, типа data-id=“#{order.id}”, а в джаваскрипте читай через .data(‘id’). Так намного проще и логичнее.

Проблема в том, что в методе index ты не задаешь gon.order_item_id для конкретного заказа. В show у тебя один заказ, в index - массив. Лучше передавай id через data-атрибут в HTML, а не через gon - так у каждого элемента будет свой id.

Да, проблема очевидная - у тебя на странице index несколько заказов, а gon.order_item_id хранит только одно значение. В JS ты обращаешься к одной переменной для всех элементов. Проще всего добавить data-order-id=“<%= order.id %>” для каждого .item-block в ERB шаблоне и брать через $(this).data(‘order-id’) в JS. Тогда каждый клик получит свой правильный id.