То, что я пытаюсь сделать, это иметь ограничение на мои маршруты, чтобы убедиться, что объект является «виджетом» или «звездочкой» или чем-то еще, прежде чем направлять его и, в конечном итоге, проверять его.
Изучив http://guides.rubyonrails.org/routing.html#advanced-constraints, в файле route.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"}