Расширенное ограничение маршрутизации 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, а не создать ограничение, особенно такое, которое извлекает все виджеты при каждом запросе.