2 votes

Google Chrome - Empêcher la resoumission d'un formulaire lors de l'actualisation d'une application Rails

Je suis nouveau dans Rails3, et je construis une application très simple (dans laquelle je ne veux pas d'AJAX). Quoi qu'il en soit, j'ai le index y create actions. Le site index l'action contient le formulaire :

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

Mon promote_controller ressemble à ça :

  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

Tout cela fonctionne bien, sauf que lorsque le formulaire est soumis avec succès, et que la notification est affichée, si l'utilisateur tape sur F5 le formulaire se soumet à nouveau. Ce qui ne devrait pas être le cas, puisque je suis en train de faire redirect_to après une sauvegarde réussie. Je crois que je fais quelque chose de fondamentalement mauvais ici, alors s'il vous plaît aidez-moi.

EDIT : Voici mon 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'

Et voici mon 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

EDIT : Le problème semble se poser dans Google Chrome.

2voto

Ryan Graham Points 4734

J'ai eu le même problème et je l'ai finalement attribué à un bug dans Chrome ( https://code.google.com/p/chromium/issues/detail?id=177855 )

La solution que j'ai utilisée consiste simplement à ajouter des paramètres d'obtention. Voici comment j'ai géré à la fois le bogue et la frustration. Le résultat peut ne pas convenir à tous les scénarios. Heureusement, mon application est interne.

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

Une autre solution consiste à créer une route de collecte qui est en fait un alias de l'index.

Sur routes.rb :

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

Sur 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

Soit dit en passant, votre find , promote y settings Les routes de correspondance semblent être redondantes avec les actions d'indexation des routes de ressources.

0voto

Catfish Points 3669

Essayez de changer vos méthodes comme ceci :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X