因此,控制器中有方法:
def create
email=params[:email]
email=email.downcase
user = User.find_by_email(email)
if user && user.authenticate(params[:password])&& user.confirmed
if session[:was_going]
@url=session[:was_going]
session[:was_going]=nil
end
@status=true
cookies[:auth_token] = {:value => user.auth_token, :expires => Time.now + 30.days }
elsif user && !user.confirmed
@status=false
@unconfirmed=true
else
#@unconfirmed=false commented line
@status=false
end
respond_to do |format|
format.js{[@status, @url]}
end
end
它响应 format.js。在身份验证过程的任何情况下,我都有布尔变量,我将其传递给 JS - @status(是否经过身份验证),@unconfirmed - 特殊消息,以及只是无效输入(如果 @status 和 @unconfirmed 都是假的)。注意注释行。
这是js模板:
if(<%=@status %>) {
window.location.replace("<%= @url %>")
}
else {
if (<%=@unconfirmed %>) {
$('.sign_in').replaceWith("<%= j render :file=> 'signs/index.html.erb' %>")
$('.signs_form').prepend("<div id='errors_of_sign'> Check your mailbox on <br /> confirmation letter </div> ")
$('.signs_form').css({"margin-top":"30px"})
$('.facebook_sign').css({"margin-top":"80px"})
$('.sign_in').fadeIn('fast')
}
else{
$('.sign_in').replaceWith("<%= j render :file=> 'signs/index.html.erb' %>")
$('.signs_form').prepend("<div id='errors_of_sign'> Email or password are incorrect </div> ")
$('.signs_form').css({"margin-top":"30px"})
$('.facebook_sign').css({"margin-top":"80px"})
$('.sign_in').fadeIn('fast')
}
}
并且有麻烦 - 当没有注释行时,else
语句的代码根本不起作用。然后我添加了那行,现在一切正常。
你能解释一下JS的这种行为吗?我的意思是,如果没有变量@unconfirmed,那么 ruby 应该返回 nil,这在我知道的任何语言的布尔函数中等于 false,包括 JS。