11 votes

Rails 4 : quel est le problème avec cette méthode ?

Je mets à jour une application vers Rails 4 et je n'arrive absolument pas à comprendre ce qui ne va pas avec cette méthode. Le coupable est la méthode update :

def update
  respond_to do |format|
    if @doc.articles.find_index { |a| a.changed? }
      @doc.publications.destroy_all
    end
    if @doc.update_attributes(params[:doc])
      @doc.create_activity :update, owner: current_user
      if current_user.brand.editable? && params[:editing]
        format.html { redirect_to editing_url(@doc) }
      else 
        format.html { redirect_to share_url(@doc.user.ftp, @doc) }
      end
    end
  end
end

En cliquant sur submit génère cette erreur :

ActionController::UnknownFormat in DocsController#update

et met en évidence cette ligne :

respond_to do |format|

La méthode create fonctionne bien, elle ressemble à ceci :

def create
  @doc = Doc.new(params[:doc])
  respond_to do |format|
    if @doc.save
      @doc.create_activity :create, owner: current_user
      if current_user.brand.editable? && params[:editing]
        format.html { redirect_to doc_editing_url(@doc) }
      else 
        format.html { redirect_to share_url(@doc.user.ftp, @doc) }
      end
    else
      format.html { render action: "new" }
    end
  end
end

Avez-vous des idées ? Je suis totalement bloqué.

Oh, j'ai aussi cette méthode privée en tant que before_action, donc ce n'est pas ça :

private

def set_document
  @doc = Doc.find(params[:id])
end

ÉDIT

J'ai trouvé cette quasi-explication :

En Rails 4.0, ActionController::UnknownFormat est levée quand l'action ne gère pas le format de la demande. Par défaut, l'exception est traitée en répondant avec un 406 Not Acceptable, mais vous pouvez maintenant la remplacer. En Rails 3, 406 Not Acceptable était toujours retourné. Aucun remplacement.

ce qui me fait penser que cela a quelque chose à voir avec les routes, mais mes routes devraient être par défaut si je les ai déclarées comme ceci, non ?

resources :docs, :except => [:new, :show] do
  get "adjust/:state" => "docs#adjust", :as => :adjust
  patch "editing" => "docs#editing", :as => :editing
  patch "reupdate/" => "docs#reupdate", :as => :reupdate
  get "pdf" => "docs#pdf", :as => :pdf
  collection { post :sort }

ÉDIT 2

Ajouter le JSON au contrôleur, c'est-à-dire :

format.html { redirect_to share_url(@doc.user.ftp, @doc) }
format.json { render action: 'share', status: :created, location: @doc }

me donne une erreur de méthode inconnue et semble me rediriger vers la page d'édition :

Affichage de .../fin/app/views/docs/_form.html.erb où la ligne #19 a levé :
undefined method `covers?' for nil:NilClass

Vraiment aucune idée de ce qui se passe ici.

2voto

iltempo Points 7276

Une raison possible peut être que si @doc.update_attributes(params[:doc]) renvoie false, aucun bloc de format n'est exécuté dans la méthode de mise à jour.

Généralement, vous appelez l'action edit dans ce cas.

1voto

gertas Points 7113

Si vous ne servez que du HTML, vous n'avez pas besoin de respond_to et format.html du tout.

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