Registering or logging in when creating a new comment object
My opinions:


The class methods by and others are unnecessary.
The service object should be initialized by feeding objects instead of params.
Build a guest user is not job of CommentService.


Then code like these:

# Controller
def create
  user     = current_user || build_guest_user
  @comment = user.new(params[:comment])
  service  = CommentService.new(@comment, user)
  if service.save
     if user.guest?
       redirect_to 'guest_user_sign_in_or_register'
     else
       redirect :back, notice: "Comment created"
     end
  else
     # blah blah
  end
end

# ApplicationController
def build_guest_user
  # your logic here
end

# CommentService
def initialize(comment, user)
  @comment = comment
  @user    = user
end

def save
  if @comment.save
    # extra service logic here
  else
    false
  end
end


Add

Mohamad, think about this, when a visitor hit a "Post Comment" button, he will reach create. 

If he's logged in, that's fine. 

If he not logged in, he will be treated as a guest user, no matter registered or not. -- Then treated by build_guest_user method.

Then, after comment saved, the controller can judge if he is a guest user or not. If not, nothing to do. If he is, an Ajax template will be rendered back asking his signing in or register.

If he signed in, the comment under the guest will be moved to his user account. And this guest user will be deleted, guest session be replaced by user session.

If he register, same as above.

If he refuse to either sign in or register, the guest user and his comment will be kept there.