2014-03-19 140 views
1

我想要做的是對我的路由有一個約束,以確保對象是一個「小部件」或「鏈輪」或任何之前路由到它,並最終驗證反對Rails的高級路由約束沒有路由匹配

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"}

回答

2

的問題是這條線:

@widgets.include?(request.widget_slug) 

您對request對象調用widget_slug,該對象對widgets一無所知。這裏是請求的文檔:http://api.rubyonrails.org/classes/ActionDispatch/Request.html

我建議將此功能移到窗口小部件控制器。在show動作中進行驗證非常簡單,而不是創建一個約束,尤其是在每個請求上都會獲取所有小部件的約束。

+0

謝謝你的方向,正是我需要的 –

相關問題