【问题标题】:Rails advanced routing constraint no route matchesRails 高级路由约束没有路由匹配
【发布时间】:2014-04-25 20:05:35
【问题描述】:

我想要做的是对我的路由进行限制,以确保该对象在路由到它之前是“小部件”或“链轮”或任何东西,并最终对其进行验证

查看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"=&gt;"ultra/lifter"}

【问题讨论】:

    标签: ruby-on-rails constraints slug


    【解决方案1】:

    问题出在这一行:

        @widgets.include?(request.widget_slug)
    

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

    我建议将此功能移至小部件控制器。在您的显示操作中进行验证非常简单,而不是创建一个约束,尤其是在每个请求上获取所有小部件的约束。

    【讨论】:

    • 谢谢你的指导,正是我需要的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    相关资源
    最近更新 更多