This information should be used as part of building/updating the post, prior to saving it.

I would change this to be:

    before_action :update_published_param, on: [:create, :update]

    def update_published_param
      is_draft = (params.delete(:commit) == "save as draft")
      params[:post][:published] = is_draft? "1" : "0"
    end

and update the `post_params`'s permit to include `:published`.  From there, the model can take over any necessary business logic.