That's _really_ ugly. Here's my take on the problem:
```ruby

class MenuItem
  # This is the sorting operator for Menu Items.
  # When sorting, any manually-set priority has higher... priority.
  # Otherwise, we sort by the string value of the label (if a proc, it's eval'd).
  def <=>(other)
    result = render_or_call(label) <=> render_or_call(other.label)
    result = priority <=> other.priority
    result
  end
end

# Added into the existing view_helpers/method_or_proc_helper.rb
module MethodOrProcHelper
  # Simply returns a string value, no matter the data type.
  # This is for when you don't want to evaluate the Proc in a special context.
  def render_or_call(string_or_proc)
    case string_or_proc
    when String, Symbol
      string_or_proc.to_s
    when Proc
      string_or_proc.call.to_s
    end
  end
end
```

Now as it is, I'm not really sure what any of these versions of `<=>` is doing, since we're setting the result twice. It doesn't seem like the first comparison would ever be used.