2013-10-16 61 views
3

我上传了几张图片(来自http://localhost:3000/choices/new),这些图片可以正常工作,但是我试图在保存后重新导向到:http://localhost:3000/choicesRails 4 - 为什么我保存后不能重定向?

这里是我的控制器:

#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) 

然而, “新” 的页面保持不变。任何关于如何正确重定向的想法,或许是通过一条说明“图片上传成功”的Flash消息?

非常感谢!

+0

它是异步请求吗? –

+0

是的,这是一个异步请求。 – Dodinas

+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 
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 

现在,在你的共享/ redirect.js.erb文件(注意这是一个共享文件,这样你就可以重复使用它):

#shared/redirect.js.erb 
window.location.href = '<%= @path %>'; 
相关问题