Rails обрабатывает ноль / неопределенный метод - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь переместить то, что называется / категории, в /digital-catalog.

У меня все перенаправлено, и оно работает, однако происходит сбой при вводе имени url_name, когда его нет.

Я в значительной степени новичок с троичным оператором, но похоже, что он терпит неудачу.

Код не работает по следующему адресу:

- custom_search_path = action_name == 'show' ? category_path(@category.url_name) : digital_catalog_path
.search-cont
 = form_tag custom_search_path, id: 'search-filter', method: :get do
   = search_field_tag :search_input, params[:search_input], placeholder: 'Search', class: 'form-control'
   - if params[:search_input]
     = link_to 'x', custom_search_path, class: 'add-on'
   = submit_tag 'go'

Точное сообщение об ошибке:

NoMethodError в категориях # show

неопределенный метод `url_name 'для nil: NilClass

Мой КатегорииКонтроллер выглядит так:

class CategoriesController < ApplicationController
  respond_to :html, :json
  before_action :load_category, only: [:show]
  before_action :require_user

  def index
    @categories = Category.ordered.search(params[:search_input]).paginate(page: params[:page])
    respond_with @categories
  end

  def show
    if @category.nil?
      redirect_to '/'
    else
      @items = @items.search(params[:search_input]).paginate(page: params[:page])
      @response = { category: @category, items: @items }
      respond_with @response
    end
  end

  private

  def load_category
    @category = Category.find_by!(url_name: params[:id])
    @items = @category.items
    add_breadcrumb 'categories', digital_catalog_path
    add_breadcrumb @category.name
  end
end

Как мне поступить, когда кто-то входит в URL, который здесь не совпадает?

Вместо этого я попытался добавить помощника:

def route_category
 if action_name == 'show'
   redirect_to digital_catalog_path(@category.url_name)
 else
   redirect_to root_path
 end
end

Который заканчивается неопределенным методом `redirect_to 'и, честно говоря, не решает проблему с тегом формы, получающим правильные данные.

EDIT:

Я также пытался получить то же сообщение об ошибке:

def show
 if @category.url_name.nil?
   redirect_to root_path
 else
   @items = @items.search(params[:search_input]).paginate(page: params[:page])
   @response = { category: @category, items: @items }
   respond_with @response
 end
end

Так как мне обработать URL, которого нет?

РЕДАКТИРОВАТЬ: я добавил полностью в CategoriesController. Наряду с обновлением метода show, который, как я думал, будет обрабатывать ошибку, но это не так.

1 Ответ

0 голосов
/ 22 января 2019

Я все еще не нашел правильный способ отправить его на страницу 404, но это мой пробел:

def show
 if @category
   @items = @items.search(params[:search_input]).paginate(page: params[:page])
   @response = { category: @category, items: @items }
   respond_with @response
 else
   redirect_to digital_catalog_path
 end
end

private

def load_category
  begin
    @category = Category.find_by!(url_name: params[:id])
    @items = @category.items
    add_breadcrumb 'categories', digital_catalog_path
    add_breadcrumb @category.name
  rescue ActiveRecord::RecordNotFound => e
    @category = nil
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...