【问题标题】:Rails, entity does not updatedRails,实体未更新
【发布时间】:2013-02-24 22:43:51
【问题描述】:

我有一些名为“组”的实体和一些基本CRUD 操作的控制器。我面临的问题是,当我尝试更新(编辑)这个实体时,它没有得到更新。我只是为此使用update_attributes

def update
  group = Group.find(params[:id])
  group.update_attributes! params[:group]
  render :json => group.to_json()
end

这是我在 WEBrick 控制台中得到的:

Started PUT "/groups/264.json?$$hashKey=00J&_method=PUT&group_id=null&item_sufix=null&key=null&name=ddddddddd&subgroups=" for 127.0.0.1 at 2013-02-25 00:32:03 +0200
Processing by GroupsController#update as JSON
  Parameters: {"$$hashKey"=>"00J", "group_id"=>"null", "item_sufix"=>"null", "key"=>"null", "name"=>"ddddddddd", "subgroups"=>"", "id"=>"264", "group"=>{}}

我想问题是为什么 params[:group] 是空的。但是为什么会发生这种情况,因为我们可以看到所有需要的字段(在这种情况下为:name)都带有请求?在 Group 模型中,我确实有 attr_accessible :name

至于路由(实际上不知道它们是否与我的问题有关)我的 config/routes.rb 中有此实体的单行:

resources :groups

这里是“组”实体的路线摘要:

          groups GET    /groups(.:format)                 groups#index
                 POST   /groups(.:format)                 groups#create
       new_group GET    /groups/new(.:format)             groups#new
      edit_group GET    /groups/:id/edit(.:format)        groups#edit
           group GET    /groups/:id(.:format)             groups#show
                 PUT    /groups/:id(.:format)             groups#update
                 DELETE /groups/:id(.:format)             groups#destroy

Rails 版本:Rails 3.2.11

【问题讨论】:

  • 对我来说似乎是传入的请求有问题。是什么发送的,为什么看起来这么奇怪?
  • @Jesper,我从 AngularJS 应用程序(AJAX 请求)发送它,但我想谁以及如何发送它并不重要。请求有什么问题?如您所见,我发送了整个对象,但由于 name 出现在请求中并出现在 attr_accessible 中 - 为什么它在 params[:group] 中不存在?
  • 您应该将对象数据包装在"group" => {data: "goes here"} 中。我在进入您的服务器的 PUT 请求中看不到任何此类内容。这就是问题所在。

标签: ruby-on-rails activerecord rails-activerecord


【解决方案1】:

您的“组”=>{} 应该包装您的其他婴儿车,例如姓名

"group"=>{"name"=>"dddddddddd", "subgroups"=>"", "id"=>"264"}

这告诉我你提交的论点是错误的。

尝试传递您的婴儿车,例如 group[name]=ddddddddd 和 group[id]=264

【讨论】:

  • 如果我确实请求创建实体,我将按原样传递参数并且它可以工作 - Parameters: {"name"=>"sssdasdasd", "group"=>{"name"=>"sssdasdasd"}}
  • 好吧,我可以告诉您,当您的更新/创建操作通过 params[:group] 时,它只会查看该哈希,因此除非属性在那里,否则它不会使用它们。顶级属性将被忽略,因此没有理由像那样传递它们。 rails 怎么知道这个顶级名称值属于任何东西?
  • 开始 PUT "/groups/264.json?$$hashKey=00J&_method=PUT&group_id=null&item_sufix=null&key=null&name=ddddddddd&subgroups=" for 127.0.0.1 at 2013-02-25 00:32:03 +0200 告诉您问题所在。
  • how would rails know that this top level name value belongs to anything? - 我想这可以从使用 attr_accessible 设置的值中得知。不是吗?
  • 模型只得到你的控制器传递给它的东西。现在你只传递在组散列中找到的内容。 attr_accessible 仅表示您允许传递列出的参数,它不会映射它们。
【解决方案2】:

您不能使用 Group 作为模型名称,因为它与 ActiveRecord 组冲突。将 Group 更改为 XGroup,然后重试。

【讨论】:

  • 但在同一控制器的create 方法中工作正常:group = Group.new params[:group]
  • 它失败的方式是神秘且难以理解的,这可能不是你的问题,但值得一试以确保。
  • 我有另一个名为 manufacturer 的实体(模型/控制器)有同样的问题。但是我检查了你的猜测 - 将 Group 重命名为 Igroup 对我没有一点帮助,除了它需要我生命中的 5 分钟(
  • 很抱歉,但总的来说,在命名 rails 模型时应该小心,避免使用任何可能是 rails 保留字的内容。一个经典的例子是尝试向模型添加属性“类型”。当您确实引入冲突时,它会以神秘的失败出现,起初很难弄清楚。我仍然会避免使用 Group 作为模型名称。
【解决方案3】:

找到解决方案。 控制台输出:

Parameters: {"$$hashKey"=>"00J", "group_id"=>"null", "item_sufix"=>"null", "key"=>"null", "name"=>"ddddddddd", "subgroups"=>"", "id"=>"264", "group"=>{}}

说参数是发送的,但它没有说明它们是如何发送的。这就是让我震惊的原因。我认为如果 rails 可以看到这些参数,那么它们会以正确的方式发送。当我检查时 - 此参数是常规 POST 参数(可以从我放置请求 url 的原始帖子中看到),而 rails 要求此参数位于请求正文(有效负载)中。这就是为什么内部group 保持空白的原因。

【讨论】:

  • 实际上我不知道 SO 的最佳做法是什么 - 我应该用解决方案更新我的原始帖子还是创建单独的答案...
猜你喜欢
  • 1970-01-01
  • 2014-02-10
  • 2017-10-06
  • 2023-01-24
  • 1970-01-01
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多