Ruby on Rails 5 - Ресурс выдает ошибку при проверке, если он уже существует - существует ли он или нет - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь проверить, существует ли продукт уже или нет - если это так, должно появиться флэш-сообщение со ссылкой на продукт, который уже существует.Если нет, продукт должен быть создан.

Проблема заключается в том, что возникает ошибка флэш-памяти, независимо от того, существует ли продукт уже или нет.Где я иду не так?

products_controller.rb:

def create
    @product = Product.new(product_params)

    if @product.product_code.present?
        @existing_product = Product.where(product_code: "#{@product.product_code}").ids.first.to_s
        flash.now[:error] = %Q[This product already exists: <a href="/products/#{@existing_product}">#{@product.product_code}</a>. Please either rename this product or view/edit the existing one.].html_safe
        render 'new'

    elsif @product.save
        redirect_to @product
    else
        render 'new'
    end

end

Если я попытаюсь использовать существует?метод (а не настоящее?), я получаю следующую ошибку:

undefined method `exists?' for "1234":String

1234 - это код продукта, который я пытаюсь.

1 Ответ

0 голосов
/ 17 ноября 2018

Ваше условие проверяет не ту вещь.Это:

if @product.product_code.present?

только проверяет, присутствует ли product_code в @product, который вы только что сделали, он не проверяет, есть ли уже что-нибудь в базе данных с этим кодом продукта.

Я думаю, вы хотите что-то более похожее на это:

@existing_product = Product.find_by(product_code: @product.product_code)
if @existing_product
  flash.now[:error] = ...
  render 'new'
elsif @product.save
  redirect_to @product
else
  render 'new'
end

Вы можете использовать find_by, чтобы найти то, что вы ищете, которое либо даст вам продукт, либо nil, если его нет.t соответствующий продукт.

Возможно, вы захотите взглянуть на пару других вещей:

  1. Было бы лучше использовать помощник по URL, а не создавать ссылку вручную.
  2. Ваша модель должна проверять уникальность кодов продукта, а не контроллера.
  3. Как отмечает Дориан в комментариях, HTML во флэш-сообщениях не лучшая идея.Вам лучше проверить @existing_product в представлении, а затем установить ссылку и любое «сложное» сообщение об ошибке, которое вам нужно полностью в представлении.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...