我试图做的是对我的路线设置一个约束,以确保该对象是一个"小部件"或者"链轮"路由到它之前的任何事情,并最终验证它
看了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"}
答案 0 :(得分:2)
问题在于这一行:
@widgets.include?(request.widget_slug)
您在请求对象上调用widget_slug
,该对象对窗口小部件一无所知。以下是请求的文档:http://api.rubyonrails.org/classes/ActionDispatch/Request.html
我建议将此功能移至窗口小部件控制器。它非常简单,可以在show动作中进行验证,而不是创建一个Constraint,尤其是在每个请求中获取所有小部件的约束。