Rails 4 - 保存后为什么我不能重定向?

时间:2013-10-16 18:22:06

标签: 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 @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)

然而,“新”页面仍然是静态的。关于如何正确地重定向这个的想法,也许是用闪存消息说“图像上传成功”?

非常感谢!

2 个答案:

答案 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 %>';