2

私はRails3が初めてで、非常に単純なアプリを構築しています(AJAXは必要ありません)。とにかく、私はindexcreateアクションを持っています。indexアクションには次の形式が含まれます。

<%= form_for @message, url: promote_index_path do |f| %>
 ...
<% end %>

promote_controllerはこのように見えます:

  def index
    @message = Message.new url: @last_video, message_body: @last_message
  end

  def create
    @message = current_user.messages.new(params[:message])
    @message.get_video_id
    if @message.save
      redirect_to promote_index_url, flash: {notice: "Promotion has been started"}
    else
      render 'index'
    end
  end

フォームが正常に送信された場合を除き、これはすべて正常に機能し、通知が点滅し、ユーザーが を押した場合F5、フォームはそれ自体を再送信します。redirect_to保存が成功した後に行っているため、これは当てはまりません。ここで根本的に間違ったことをしていると思うので、助けてください。

編集:これが私のものですroutes.rb

 resources :home
  resources :find
  resources :promote
  resources :settings
  root to: 'home#index'
  match 'auth/:provider/callback', to: 'sessions#create'
  match 'auth/failure', to: redirect('/')
  match 'logout', to: 'sessions#destroy', as: 'logout'
  match 'find', to: 'find#index', as: 'find'
  match 'promote', to: 'promote#index', as: 'promote'
  match 'settings', to: 'settings#index', as: 'settings'

そして、これが私のものですrake routes

Jans-MacBook-Pro-2:tp3 jan$ rake routes
settings_index GET    /settings/index(.:format)          settings#index
    home_index GET    /home(.:format)                    home#index
               POST   /home(.:format)                    home#create
      new_home GET    /home/new(.:format)                home#new
     edit_home GET    /home/:id/edit(.:format)           home#edit
          home GET    /home/:id(.:format)                home#show
               PUT    /home/:id(.:format)                home#update
               DELETE /home/:id(.:format)                home#destroy
    find_index GET    /find(.:format)                    find#index
               POST   /find(.:format)                    find#create
      new_find GET    /find/new(.:format)                find#new
     edit_find GET    /find/:id/edit(.:format)           find#edit
          find GET    /find/:id(.:format)                find#show
               PUT    /find/:id(.:format)                find#update
               DELETE /find/:id(.:format)                find#destroy
 promote_index GET    /promote(.:format)                 promote#index
               POST   /promote(.:format)                 promote#create
   new_promote GET    /promote/new(.:format)             promote#new
  edit_promote GET    /promote/:id/edit(.:format)        promote#edit
       promote GET    /promote/:id(.:format)             promote#show
               PUT    /promote/:id(.:format)             promote#update
               DELETE /promote/:id(.:format)             promote#destroy
      settings GET    /settings(.:format)                settings#index
               POST   /settings(.:format)                settings#create
   new_setting GET    /settings/new(.:format)            settings#new
  edit_setting GET    /settings/:id/edit(.:format)       settings#edit
       setting GET    /settings/:id(.:format)            settings#show
               PUT    /settings/:id(.:format)            settings#update
               DELETE /settings/:id(.:format)            settings#destroy
          root        /                                  home#index
                      /auth/:provider/callback(.:format) sessions#create
  auth_failure        /auth/failure(.:format)            :controller#:action
        logout        /logout(.:format)                  sessions#destroy
          find        /find(.:format)                    find#index
       promote        /promote(.:format)                 promote#index
      settings        /settings(.:format)                settings#index

編集: 問題は Google Chrome にあるようです。

4

2 に答える 2

2

私は同じ問題を抱えていましたが、最終的に Chrome のバグ ( https://code.google.com/p/chromium/issues/detail?id=177855 )まで追跡しました。

私が使用した回避策は、いくつかの get パラメーターを追加することです。バグとフラストレーションの両方に対処した方法を次に示します。結果は、すべてのシナリオに適しているとは限りません。幸いなことに、私のアプリは内部です。

def create
  @message = current_user.messages.new(params[:message])
  @message.get_video_id
  if @message.save
    flash[:notice] = "Promotion has been started"
    redirect_to promote_index_url(chrome_bug_workaround: 177855)
  else
    render 'index'
  end
end

もう 1 つの方法は、基本的に index のエイリアスであるコレクション ルートを作成することです。

routes.rb

match 'promote/all' => 'promote#index', :as => 'all_promotions'

promote_controller.rb

def create
  @message = current_user.messages.new(params[:message])
  @message.get_video_id
  if @message.save
    redirect_to all_promotions_url, flash: {notice: "Promotion has been started"}
  else
    render 'index'
  end
end

余談ですが、findpromote、およびsettingsmatch ルートは、リソース ルートの index アクションと重複しているように見えます。

于 2013-03-05T18:53:18.263 に答える
0

メソッドを次のように変更してみてください。

def index
    @message = Message.new url: @last_video, message_body: @last_message

    respond_to do |format|
      format.html
    end
  end

  def create
    @message = current_user.messages.new(params[:message])
    @message.get_video_id

    respond_to do |format|
      if @message.save
        format.html {redirect_to promote_index_url, notice: "Promotion has been started"}
      else
        render 'index'
      end
    end
  end
于 2013-03-04T20:28:47.113 に答える