重定向上的控制器和jquery问题
我有一个重定向上的控制器和jquery问题,jquery,ruby-on-rails-3,Jquery,Ruby On Rails 3,我有一个coming\u soon\u controller,它显示一个表单供用户订阅电子邮件列表。它会将一个电子邮件地址传递给: def create @subscriber = Subscriber.new(params[:subscriber]) @email = params[:subscriber][:email] @ip = request.ip respond_to do |format| if @subscriber.sa
coming\u soon\u controller
,它显示一个表单供用户订阅电子邮件列表。它会将一个电子邮件地址传递给:
def create
@subscriber = Subscriber.new(params[:subscriber])
@email = params[:subscriber][:email]
@ip = request.ip
respond_to do |format|
if @subscriber.save
ComingSoonMailer.thanks_email(@email).deliver
format.js
format.html {redirect_to comingsoon_path(:success => 'hooray'), :notice => "Got it. Thanks! (and remember, you can unsubscribe at any time)"}
else
format.html {redirect_to comingsoon_path, :alert => "Shucks. There was a problem. Mind trying again?"}
end
end
end
当按钮被单击时,我有一些jquery,它去掉了按钮并显示加载的gif:
<script>
$(function() {
$( ".subscriberSubmit" ).click(function () {
$(this).fadeOut();
$('.loadingImage').fadeIn();
});
});
</script>
我遇到的问题是当保存失败时——比如它没有通过模型中的验证。下面是发生的情况:
Started POST "/subscribers" for 127.0.0.1 at 2011-07-16 13:36:07 -0400
13:36:07 web.1 | Processing by SubscribersController#create as JS
13:36:07 web.1 | Parameters: {"utf8"=>"✓", "authenticity_token"=>"S99c2kgEnc9w6x61oJNL5399snImRJoVgAxXZTf8umsDg=", "subscriber"=>{"email"=>""}, "commit"=>""}
13:36:07 web.1 | Redirected to http://localhost:5000/comingsoon
13:36:07 web.1 | Completed 302 Found in 7ms
它说它可以正确重定向,但flash永远不会显示,加载的gif仍然存在。。。基本上,虽然rails做了重定向,但应用程序似乎挂起了。我认为控制器中的重定向,因为它只是HTML,实际上会重新加载页面并重置所有内容——但显然我错了。无论如何,我可以解决这个问题,所以它重定向并正确显示闪光灯
澄清
在这种情况下——我希望它重定向到/comingsoon,而不是呈现JS。根据日志,它似乎正在重定向,但浏览器没有重新加载页面,因此表单没有被重置。现在我理解了你的问题,我可以更轻松地回答它 它不会因为您的请求类型而刷新。当您设置
:remote=>true
时,它将向服务器发送js请求。一旦服务器处理完您的请求,它就会发回信息,其中一部分信息就是mimeType。然后在控制器中,处理从服务器返回的信息。这就是你的代码
respond_to do |format|
if @subscriber.save
ComingSoonMailer.thanks_email(@email).deliver
format.js
format.html {redirect_to comingsoon_path(:success => 'hooray'), :notice => "Got it. Thanks! (and remember, you can unsubscribe at any time)"}
else
format.html {redirect_to comingsoon_path, :alert => "Shucks. There was a problem. Mind trying again?"}
end
end
在本例中,您的格式将始终是js,因为您总是希望从服务器返回js类型,这意味着您需要正确地呈现它,否则您的控制器将执行一些默认操作(在本例中,这是一个异步重定向,返回到您的comingsoon)
这意味着在else
子句中还需要有format.js
。一个好的计划就是根据您的记录是否正确保存,呈现两个不同的部分。在您的else
子句中,您可以呈现一个js,该js删除您的表单
并呈现一个新表单,并显示相应的消息,告诉用户它失败了。你也可以试着
else
format.js {redirect_to comingsoon_path, :alert => "Shucks. There was a problem. Mind trying again?"}
end
虽然我不知道你的控制器会怎么处理
查看Rails3中关于UJS的精彩文章
祝你好运。在我发布的示例中,我故意试图推送失败。控制器的
else
部分中没有JS,那么为什么它会尝试渲染为JS呢?因为表单是remote=>true
?顺便说一句,它说的是| Rendered subscribers/create.js.erb(0.3ms)
当操作成功时,它只是在日志的不同部分,在电子邮件发送后。对于a-1来说似乎没有必要,因为问题一开始就不清楚,我根据给出的答案给出了一个有教育意义的答案。
else
format.js {redirect_to comingsoon_path, :alert => "Shucks. There was a problem. Mind trying again?"}
end