Ruby on rails Rails 4-为什么可以';保存后我不能重定向吗?

Ruby on rails Rails 4-为什么可以';保存后我不能重定向吗?,ruby-on-rails,redirect,ruby-on-rails-4,Ruby On Rails,Redirect,Ruby On Rails 4,我正在上传几个图像(来自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 @ch

我正在上传几个图像(来自
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)
然而,“新”页面仍然是静态的。有没有关于如何正确重定向的想法,也许是一条写着“图片上传成功”的快闪消息


非常感谢

我刚刚了解了什么是异步请求,所以我希望这有助于

如果您使用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
#/views/new.js.erb
window.location=
#app/controllers/choices_controller.rb
def创建
@选择=选择。新建(选择参数)
@choice.filename=params[:filename].titleize
如果@choice.save
回应待办事项|格式|
format.html{重定向到选项路径}
format.js
结束
结束
结束

这个问题与上面的答案类似,但有点通用。这花了一些时间,但我终于让它工作了,我注册了StackOverflow,只是为了能发布一个答案。这是我的解决方案(尽管我使用JS作为我的格式)

现在在您的shared/redirect.js.erb文件中(请注意,这是一个共享文件,您可以重用它):

#shared/redirect.js.erb
window.location.href='';

是异步请求吗?是的,是异步请求。为什么是异步请求,因为您只想重定向?我正在使用jQuery文件上载上载您可以使用javascript发送javascript响应并重定向用户(
window.location.href=“url”
如果我没记错的话。如果我是你,我还是会同步进行。
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
window.location.href = '<%= @path %>';