eRuby - неявное преобразование nil в String при сравнении чисел в операторе if

У меня есть базовый eRuby каждый цикл

 <% @product_images.each do |image|%>

        <% if @counter < 4 %>

           <% p 'Im in here' %>
        <% else %>

           <% return %>
        <% end %>

          <% @counter += 1 %>
          <% p @counter %>

 <% end %>

Внутри моей петли у меня есть if заявление, которое проверяет, если @counter является < чем 4,

Код контроллера

def show

     productId = params[:id]

     @product_images = ProductImage.where("product_id = ?", productId)

     @counter = 0
end

Когда я запускаю этот код, он должен вернуться, если счетчик больше 4, но я получаю сообщение об ошибке no implicit conversion of nil into String

Это довольно простой код, я не могу понять, что я делаю неправильно. Кажется, что он ломается в линию

<% if @counter < 4 %>

Вот изображение ошибки:

1 ответ

Решение

Похоже, вы пытаетесь ограничить количество @product_images которые оказываются на ваш взгляд. Вместо того, чтобы использовать @counterВы должны просто ограничить количество @product_images в вашем контроллере что-то вроде:

def show
  @product = Product.find_by(id: params[:id])
  @product_images = @product.product_images.limit(4)
end

А потом, на ваш взгляд, сделайте что-то вроде:

<% @product_images.each do |image| %>
  # do stuff
<% end %>

Это, естественно, предполагает, что:

class Product < ActiveRecord::Base 
  has_many :product_images
end

А также:

class ProductImage < ActiveRecord::Base
  belongs_to :product
end

Вы можете вернуть эту логику в представление, например:

<% @product.product_images.limit(4).each do |image| %>
  # do stuff
<% end %>

А потом твой show действие может быть просто:

def show
  @product = Product.find_by(id: params[:id])
end

Но я предпочитаю оставить его в контроллере, чтобы уменьшить связь между вашими взглядами и вашими моделями.

Другие вопросы по тегам