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 に答える