2016-05-15 67 views
1

我正在嘗試做我認爲應該很簡單的事情:使用默認更新操作對單個文本字符串字段進行簡單編輯。但它似乎並沒有工作,儘管許多嘗試和改變。嵌套資源無法更新

有沒有錯誤和提示信息成功響應,但信息不會保存到數據庫中所有:

的routes.rb

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

的意見/請柬/ edit.html.haml

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

控制器/ 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 

而這裏的日誌:

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

有你爲什麼叫@ invitation.update_attributes(invitation_params)兩次理由嗎? – Bustikiller

+0

@Bustikiller我只是試圖看看是否有可能導致問題的事情。安東尼的解決方案是正確的,所以我現在也清理了所有這些垃圾:) –

+0

完美!只是想確保你沒有錯過這個細節;) – Bustikiller

回答

0

檢查你的params對象在你的日誌格式。您的邀請參數正在params["invitation"]密鑰中傳遞,但您正在根據根參數散列中的參數將您的對象列入白名單並進行更新。

另外請注意,您的日誌報告說,你想更新未經許可PARAMS邀請:

不允許的參數:UTF8,_method,authenticity_token,邀請,承諾,ID

您可以通過簡單地更新invitation_params解決這個使用params[:invitation]而非params像這樣:

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

另外,如果您嘗試更新未列入白名單的參數以防止將來出現這些類型的問題,則可能需要考慮提出錯誤。

在Rails配置:

config.action_controller.action_on_unpermitted_parameters = :raise 
+0

可笑。我花了大約5個小時試圖嘗試不同的事情,並且我看到'.require(:邀請)'在很多地方都有,但是沒有意識到它很重要。立即修復 - 非常感謝! –

+0

是的,我也被那幾次燒了。我發現爲了好的措施,最好設置'config.action_controller.action_on_unpermitted_pa​​rameters =:raise'。 –