Расширенное ограничение маршрутизации Rails нет совпадений маршрутов

То, что я пытаюсь сделать, это иметь ограничение на мои маршруты, чтобы убедиться, что объект является "виджетом" или "звездочкой" или чем-то еще до того, как направить его к нему, и в конечном итоге проверить его

Посмотрев на http://guides.rubyonrails.org/routing.html, у меня есть на моем маршруте следующее.rb

class WidgetssConstraint
  def initialize
    @widgets = Widget.all
  end

  def matches?(request)
    @widgets.include?(request.widget_slug)

  end
end


FunParts::Application.routes.draw do
  namespace 'admin' do
    resources :widgets
    resources :sprockets
    root 'widgets#index'
  end

  get "*widget_slug" => "widgets#show" , :constraints => WidgetsConstraint.new
end

и мой контроллер виджетов выглядит так

class WidgetsController < ApplicationController
  layout 'public'

  def show
    @widget= Widget.where(slug: params[:widget_slug]).first

    if @widget.present?
      render :show
    else
      render :file => "#{Rails.root}/public/404", :layout => false, status: 404
    end
  end
end

Я получаю ошибку ниже

undefined method `widget_slug' for ActionDispatch::Request:0x56ea700

Извлеченный источник (вокруг строки № 7):

  def matches?(request)
    @trucks.include?(request.widget_slug)

  end
end

Запрос

Параметры:

{"widget_slug"=>"ultra/lifter"}

1 ответ

Решение

Проблема в этой строке:

    @widgets.include?(request.widget_slug)

Ты звонишь widget_slug на объекте запроса, который ничего не знает о виджетах. Вот документы для запроса: http://api.rubyonrails.org/classes/ActionDispatch/Request.html

Я бы предложил перенести эту функцию на контроллер виджетов. Достаточно просто выполнить проверку в вашем действии show, а не создать ограничение, особенно такое, которое извлекает все виджеты при каждом запросе.

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