2016-05-15 33 views
1

Ich versuche zu tun, was ich denke, sollte einfach sein: Führen Sie eine einfache Bearbeitung für ein einzelnes Textfeld Feld mit der Standard-Update-Aktion. Aber es scheint einfach nicht zu funktionieren, trotz vieler Versuche und Änderungen.Verschachtelte Ressource konnte nicht aktualisiert werden

Es sind keine Fehler und die Flash-Mitteilung reagiert erfolgreich, aber die Informationen nicht an die Datenbank überhaupt gespeichert:

routes.rb

resources :interviews do 
    resources :invitations do 
    put :accept 
    end 
end 

Ansichten/Einladungen/edit.html.haml

= simple_form_for [@interview, @invitation] do |f| 
    = f.error_notification 
    = f.input :testing 
    = f.submit 'Edit Invitstion', :class => 'button small' 

Controller/invitations_controller.rb

def update 
    @invitation = Invitation.find(params[:id]) 
    @interview = Interview.find(params[:interview_id]) 

    @invitation.update_attributes(invitation_params) 

    if @invitation.update_attributes(invitation_params) 
    redirect_to edit_interview_invitation_path(@interview, @invitation), notice: "Your profile has been successfully updated." 
    else 
    render action: "edit" 
    end 
end 

private 

def invitation_params 
    params.permit(:user_id, :interview_id, :invitation_id, :session_time, :workflow_state, :testing) 
end 

Und hier ist das Protokoll:

Started PATCH "/interviews/3/invitations/7" for ::1 at 2016-05-15 19:01:52 +0800 
Processing by InvitationsController#update as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"o0U5t0yPN0aE2er+DWK0uxqRGyp4ywfdSrEfvwiSQ3UUaOnr3Fd0raFs1IUqVzizKoqxRU0DDpmvysntB9fdhQ==", "invitation"=>{"interview_id"=>"3", "workflow_state"=>"invited", "session_time"=>"", "testing"=>"testtesttest"}, "commit"=>"Edit Invitstion", "interview_id"=>"3", "id"=>"7"} 
    User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["id", 7]] 
    Invitation Load (0.2ms) SELECT "invitations".* FROM "invitations" WHERE "invitations"."id" = $1 LIMIT 1 [["id", 7]] 
    Role Load (0.2ms) SELECT "roles".* FROM "roles" WHERE "roles"."id" = $1 LIMIT 1 [["id", 3]] 
    Interview Load (0.2ms) SELECT "interviews".* FROM "interviews" WHERE "interviews"."id" = $1 ORDER BY created_at DESC LIMIT 1 [["id", 3]] 
    CACHE (0.0ms) SELECT "invitations".* FROM "invitations" WHERE "invitations"."id" = $1 LIMIT 1 [["id", "7"]] 
    CACHE (0.0ms) SELECT "interviews".* FROM "interviews" WHERE "interviews"."id" = $1 ORDER BY created_at DESC LIMIT 1 [["id", "3"]] 
Unpermitted parameters: utf8, _method, authenticity_token, invitation, commit, id 
    (0.1ms) BEGIN 
    Invitation Exists (0.4ms) SELECT 1 AS one FROM "invitations" WHERE ("invitations"."user_id" = 3 AND "invitations"."id" != 7 AND "invitations"."interview_id" = 3) LIMIT 1 
    (0.1ms) COMMIT 
Redirected to http://localhost:3000/interviews/3/invitations/7/edit 
Completed 302 Found in 12ms (ActiveRecord: 1.6ms) 


Started GET "/interviews/3/invitations/7/edit" for ::1 at 2016-05-15 19:01:52 +0800 
Processing by InvitationsController#edit as HTML 
    Parameters: {"interview_id"=>"3", "id"=>"7"} 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["id", 7]] 
    Invitation Load (0.3ms) SELECT "invitations".* FROM "invitations" WHERE "invitations"."id" = $1 LIMIT 1 [["id", 7]] 
    Role Load (0.2ms) SELECT "roles".* FROM "roles" WHERE "roles"."id" = $1 LIMIT 1 [["id", 3]] 
    Interview Load (0.2ms) SELECT "interviews".* FROM "interviews" WHERE "interviews"."id" = $1 ORDER BY created_at DESC LIMIT 1 [["id", 3]] 
    Rendered invitations/edit.html.haml within layouts/application (6.1ms) 
Completed 200 OK in 48ms (Views: 39.1ms | ActiveRecord: 1.6ms) 
+0

Gibt es einen Grund, warum Sie @ invitation.update_attributes (invitation_params) Aufruf zweimal? – Bustikiller

+0

@Bustikiller Ich habe gerade gehackt, um zu versuchen, um zu sehen, ob etwas in Zusammenhang damit das Problem verursacht haben könnte. Anthonys Lösung war die richtige, aber ich habe jetzt auch den ganzen anderen Kram aufgeräumt :) –

+0

Perfekt! Ich wollte nur sicherstellen, dass du dieses Detail nicht verpasst hast;) – Bustikiller

Antwort

0

Überprüfen Sie das Format Ihrer params Objekt in Ihren Protokollen. Ihre Einladungs-Parameter werden innerhalb des Schlüssels params["invitation"] übergeben. Sie führen jedoch eine Whitelisting durch und aktualisieren Ihr Objekt basierend auf den Parametern im Root-Params-Hash.

Beachten Sie auch, dass Ihre Protokolle berichten, dass Sie versuchen, Ihre Einladung mit unpermitted params zu aktualisieren:

Unzulässige Parameter: UTF-8, _method, authenticity_token, Einladung, verpflichten, id

Sie können dieses Problem beheben, indem Sie einfach Ihre invitation_params Aktualisierung params[:invitation] zu verwenden, anstatt params wie so:

def invitation_params 
    params.require(:invitation).permit(:user_id, :interview_id, :invitation_id, :session_time, :workflow_state, :testing) 
end 

Wenn Sie versuchen, einen Parameter zu aktualisieren, der nicht auf die weiße Liste gesetzt ist, können Sie in Erwägung ziehen, einen Fehler zu melden, um diese Art von Problemen in Zukunft zu vermeiden.

In Ihrer Schiene config:

config.action_controller.action_on_unpermitted_parameters = :raise 
+0

Lächerlich. Ich verbrachte ungefähr 5 Stunden damit, verschiedene Dinge auszuprobieren, und ich hatte diesen Teil an vielen Orten gesehen, aber ich merkte nicht, dass es wichtig war. Dinge sofort behoben - vielen Dank! –

+0

Yup, ich wurde auch mehrmals davon verbrannt. Ich finde es immer am besten, 'config.action_controller.action_on_unpermitted_parameters =: raise 'nur für ein gutes Maß zu setzen. –

Verwandte Themen