What's the correct way to run one controller action from another controller action without an HTTP redirect?

Instead of calling code across actions, extract the code to lib/ or something, and call that code from both controllers.

# lib/foo.rb
module Foo
  def self.bar
  # ...
  end
end

# posts_controller
def index
  Foo.bar
end

# things_controller
def index
  Foo.bar
end

Create an instance of the controller class:

@my_other_controller = MyOtherController.new

Then call methods on it:

@my_other_controller.some_method(params[:id])

I prefer the module idea, but this should do the trick.

You can also pass parameters as a whole from another controller:

@my_other_controller.params = params