3

我正在上传几张图片(来自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)

然而,“新”页面仍然是静态的。关于如何正确重定向此内容的任何想法,可能会显示“图片上传成功”的消息?

非常感谢!

4

2 回答 2

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
于 2013-10-17T08:40:42.287 回答
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 %>';
于 2014-08-01T09:52:06.273 回答