【问题标题】:before_filter except override not workingbefore_filter 除了覆盖不起作用
【发布时间】:2010-07-14 20:44:08
【问题描述】:

大家下午好,

我有一个控制器运行一个带有 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'

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

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

它会生成以下错误消息:

Couldn't find Deal with ID=search

此代码适用于其他几个控制器,我整天都在摸索着想看看我做错了什么。我会很感激任何帮助,谢谢。

【问题讨论】:

  • 日志显示该 URL 调用了哪个控制器操作?这绝对是您的search 操作吗?

标签: ruby-on-rails ruby overriding filter


【解决方案1】:

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

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

在你的 log/development.log 中寻找这样的一行:

Processing Admin::DealsController#show

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

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

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

【讨论】:

  • 谢谢!这正是问题所在。
猜你喜欢
  • 1970-01-01
  • 2011-03-24
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
  • 2016-03-18
  • 2020-06-14
  • 1970-01-01
相关资源
最近更新 更多