嵌套资源无法更新

时间:2016-05-15 11:05:25

标签: ruby-on-rails activerecord

我尝试做我认为应该简单的事情:使用默认的更新操作对单个文本字符串字段进行简单编辑。但是,尽管进行了许多尝试和改动,但它似乎并没有起作用。

没有错误,flash消息响应成功,但信息根本没有保存到数据库中:

的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)

1 个答案:

答案 0 :(得分:0)

检查日志中params对象的格式。您的邀请参数正在params["invitation"]密钥中传递,但您根据根参数哈希中的参数将白名单和更新对象列入白名单。

另请注意,您的日志报告您正在尝试使用未经许可的参数更新您的邀请:

  

未经许可的参数: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