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

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

Изучив 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"}


person Jay Rizzi    schedule 19.03.2014    source источник


Ответы (1)


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

    @widgets.include?(request.widget_slug)

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

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

person David Underwood    schedule 19.03.2014
comment
Спасибо за направление, именно то, что мне нужно - person Jay Rizzi; 19.03.2014