我正在上传多张图片(来自http://localhost:3000/choices/new
),效果很好,但是,我试图在保存后重定向回http://localhost:3000/choices
。
这是我的控制器:
#app/controllers/choices_controller.rb
def create
@choice = Choice.new(choice_params)
@choice.filename = params[:filename].titleize
if @choice.save
respond_to do |format|
format.html { redirect_to choices_path }
format.json { head :no_content }
end
end
end
在Rails控制台中,它输出:
Redirected to http://localhost:3000/choices
Completed 302 Found in 58ms (ActiveRecord: 52.8ms)
然而,“新”页面仍然是静态的。关于如何正确地重定向这个的想法,也许是用闪存消息说“图像上传成功”?
非常感谢!
答案 0 :(得分:3)
我刚刚了解了异步请求是什么,所以我希望这会有所帮助......
如果您使用JS发送“后台”请求,控制器如何影响浏览器的视口?
控制器是服务器端,每次发送请求时都会加载。这意味着除非您的实际浏览器直接向控制器发出HTTP请求,否则它如何导致您已呈现的视图发生更改?
JS是客户端技术,这意味着它可以代表您发生事情,但其范围仅限于采用“DOM”元素&与他们互动。
我在这方面看了一些非常有用的答案,并找到了这些想法:
所有这些答案都说类似的事情:你需要用JS处理重定向
为什么不这样做:
#app/controllers/choices_controller.rb
def create
@choice = Choice.new(choice_params)
@choice.filename = params[:filename].titleize
if @choice.save
respond_to do |format|
format.html { redirect_to choices_path }
format.json { render :json => {
:location => url_for(:controller => 'choices', :action => 'index'),
:flash => {:notice => "File Uploaded!"}
}
end
end
end
#assets/javascripts
$(document).ready(function() {
$.ajax({
success: function(data) {
window.location = data.location
}
})
});
更简洁的方法是发送一个普通的JS请求,并拥有:
#/views/new.js.erb
window.location = <%= choices_path %>
#app/controllers/choices_controller.rb
def create
@choice = Choice.new(choice_params)
@choice.filename = params[:filename].titleize
if @choice.save
respond_to do |format|
format.html { redirect_to choices_path }
format.js
end
end
end
答案 1 :(得分:0)
这与上面的答案相似,但更加通用。这需要一些游戏,但我终于让它工作了,我注册了StackOverflow,所以我可以发布一个答案。这是我的解决方案(虽然我使用JS作为我的格式)
respond_to do |format|
format.html { redirect_to choices_path }
@path = url_for(:controller => 'choices', :action => 'index')
- or - choices_path for a named route
format.js { render 'shared/redirect'}
:flash => {:notice => "File Uploaded!"}
end
现在在您的shared / redirect.js.erb文件中(注意这是一个共享文件,因此您可以重复使用它):
#shared/redirect.js.erb
window.location.href = '<%= @path %>';