before_filter除了覆盖不起作用

时间:2010-07-14 20:44:09

标签: ruby-on-rails ruby override filter

下午好,

我有一个控制器运行带有except覆盖的前置过滤器。它适用于控制器中的所有方法,保存一个。我已经从我的应用程序的另一部分复制了相关方法的代码,只是进行了我需要的更改,以使其适用于此特定区域。

以下是控制器代码的示例:

class Admin::DealsController < ApplicationController
  before_filter :populate, :except => [:index, :create, :new, :search]

  # GET /deals
  def index
    @deals = Deal.paginate(:page => params[:page], :per_page => PAGESIZE, :order => 'start_time DESC')
    @page_subtitle = "Deals"
  end

  def search
    @searchString = params[:search_string]
    @deals = Deal.paginate(:page => params[:page], :per_page => PAGESIZE, :conditions => "subject LIKE '%#{@searchString}%'")
    @page_subtitle = "Deal Search Results"
    render 'index'
  end

  protected
    def populate
      @deal = Deal.find(params[:id])
    end
end

以下是我的routes.rb文件中有关方法的路径:

admin.search_deal 'deals/search', :controller => 'deals', :action => 'search', :method => 'get'

现在,当我尝试访问此网址时:

/admin/deals/search?search_string=test&commit=Search

它会生成以下错误消息:

Couldn't find Deal with ID=search

这段代码适用于其他几个控制器,而且我整天都在试图看看我做错了什么。我将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:1)

您的路线似乎没有正确的顺序。如果你仔细查看日志文件,你可以验证这一点,但被调用的动作可能是“显示”而不是“搜索”。

任何自定义路由都应列在默认路由之上,或者更好,您应该完全删除默认路径。

在log / development.log中查找这样的行:

Processing Admin::DealsController#show

如果您使用rake routes列出路线,请确保在任何通用路线之前列出您的自定义search_deal路线。

您可能也想使用资源丰富的路线:

map.namespace :admin do |admin|
  admin.resources :deals, :collection => { :search => :get }
end