Railsで、URLパラメータにactionという名前が使われていると、controllerのactionと名前がかぶってしまって、うまくルーティングができなくなります。もちろん、そんな名前のパラメータを使わなきゃいいんだけど、昔のシステムでそんなURLを使っていて変更できないときなんかは困ったことになります。  そんな場合は、config/routes.rbで

  map.connect ":controller/:method_name/:id", :controller => "Sample", :action => "router"

みたいな感じにして、SampleControllerで

  def router
    if request.url =~ /\?.*action=([^&]+)&*/
      @param_action = $1
    end

    if self.public_methods(false).delete_if{|a| a == "router"}.include?(params[:method_name])
      eval(params[:method_name])
    else
      (エラー処理)
    end
  end

としてやれば、とりあえずなんとかなります。他にもっといい方法があるかもしれません。