Rails thin controller method to change account plan and fire slack message via a service object
def change_plan
  account = Account.find(params[:id])

  old_plan = account.plan
  new_plan = Plan.find(params[:account][:plan_id])

  # maybe this method ought to return the new_plan, since it's basically repeating the line above
  account.change_plan!(params[:account][:plan_id])

  # since account has plan method on you don't necessarily need to pass the `new_plan` explicitly
  SlackService.new.plan_change(current_user, account, old_plan, new_plan).deliver
  redirect_to action: "show", id: params[:id]
end




Now to address your questions


  
  It seemed that I had to require net/http here in the service, but wasn't sure if that was the proper place for it.
  


That's absolutely fine.


  
  I think the SLACK_WEBHOOK_URL and SLACK_WEBHOOK_CHANNEL constants should be defined here.
  These could be defined in a config file.
  I see many examples of services where the methods are class level, but it seemed to make sense to keep it instance level so you can define the channel on instantiation.
  


It's fine to use instance methods. However, you can go one step further and define something like

def SlackService.plane_change(current_user:, account:, old_plan: new_plan:)
  SlackService.new.plan_change(current_user, account, old_plan, new_plan).deliver
end


The nice thing about this is in your controller, you only have to do SlackService.plane_change(current_user:, account:, old_plan: new_plan:) this in the contoller, and you rid the controller of instantiating the class, calling method etc.


  
  Tying in with the above, the plan_change method accepts 4 params, but not sure if there's a cleaner way.
  


4 is just about ok (see Sandi Metz's article https://robots.thoughtbot.com/sandi-metz-rules-for-developers#four-method-arguments)


  
  Wasn't sure if my approach to loading the NumberHelper is correct.
  


I am not sure I understand this question