I know that with the following code:
before_action :signed_in?, only: [:new]
the action new
will be executed if the signed_in
before_action doesn't work as you think - it doesn't prevent action to be executed if callback returns false
.
I would solve your problem in a little bit different manner, for example:
before_action :redirect_to_root, :if => :signed_in?, :only => :new
# ...
private
def redirect_to_root
redirect_to root_path
end
before_action :new, unless: -> { signed_in? }
alltough i think its better to redirect in the action which was called.
def your_action_called
redirect_to :new unless signed_in?
[...code ...]
end
If you want to cover all other methods withbefore_action :signed_in?
except new action, you'b better to use :except
instead of :only
like this:before_action :signed_in?, except: :new