Rails高级路由约束没有路由匹配

时间:2014-03-19 13:58:53

标签: ruby-on-rails constraints slug

我试图做的是对我的路线设置一个约束,以确保该对象是一个"小部件"或者"链轮"路由到它之前的任何事情,并最终验证它

看了http://guides.rubyonrails.org/routing.html#advanced-constraints后,我在routes.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 个答案:

答案 0 :(得分:2)

问题在于这一行:

    @widgets.include?(request.widget_slug)

您在请求对象上调用widget_slug,该对象对窗口小部件一无所知。以下是请求的文档:http://api.rubyonrails.org/classes/ActionDispatch/Request.html

我建议将此功能移至窗口小部件控制器。它非常简单,可以在show动作中进行验证,而不是创建一个Constraint,尤其是在每个请求中获取所有小部件的约束。