2013-06-14 20 views
11

Uaktualniam aplikację do Rails 4 i nie mogę do końca życia dowiedzieć się, co jest nie tak z tą metodą. Sprawca jest metoda aktualizacji:Szyny 4: co jest nie tak z tą metodą?

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 

Kliknięcie submit generuje ten błąd:

ActionController::UnknownFormat in DocsController#update 

i podkreśla ten wiersz:

respond_to do |format| 

Sposób tworzenia działa dobrze, wygląda to tak:

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 

Jakieś myśli? Całkowicie utknąłem.

Och, mam tę prywatną metodę jako before_action też, więc to nie jest takie:

private 

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

EDIT

znalazłem ten quasi-wyjaśnienie:

In Rails 4.0, ActionController::UnknownFormat is raised when the action doesn't handle the request format. By default, the exception is handled by responding with 406 Not Acceptable, but you can override that now. In Rails 3, 406 Not Acceptable was always returned. No overrides.

co powoduje, że myślę, że ma to coś wspólnego z trasami, ale moje trasy powinny być domyślne, jeśli je zadeklarowałem, tak?

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 } 
end 

EDIT 2

Dodanie JSON do kontrolera, czyli:

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

daje mi błąd żadna metoda i wydaje się przekierować mnie do strony edycji:

Showing .../fin/app/views/docs/_form.html.erb where line #19 raised: 
undefined method `covers?' for nil:NilClass 

Naprawdę nie mam pojęcia, co tu się dzieje.

+2

czy masz 'remote: true' w formularzu? jest wysyłany za pośrednictwem JS? czy masz 'response_to: json' w twoim kontrolerze? – phoet

+0

Nie ma w formularzu 'remote: true' i nie jest on wysyłany przez JS. W moim kontrolerze nie ma 'response_to: json', ponieważ o ile wiem, nie potrzebuję tego. –

Odpowiedz

2

Jedną z możliwych przyczyn może być to, że jeśli @doc.update_attributes(params[:doc]) zwróci false, w metodzie aktualizacji nie zostanie wykonany żaden blok formatu.

W takim przypadku zazwyczaj renderujesz akcję edit.

1

Jeśli wyświetlasz tylko kod HTML, nie potrzebujesz wcale respond_to i format.html.