IMO this is more readable:
```ruby
def normalize_id(id)
  (id.is_a?(Proc) ? id.call : id).to_s.downcase.gsub ' ', '_'
end
```

Note that I removed both the unconditional `rescue` and the regex removing non alphanumeric characters. Why are we doing either of those, and why here?