【问题标题】:update_attributes rails differentiate between create and updateupdate_attributes rails 区分创建和更新
【发布时间】:2012-07-11 00:48:56
【问题描述】:

我有一个使用 update_attributes 的嵌套表单(与 RailsCasts 中显示的非常相似),它更新父对象以及更新和创建新的子对象。我希望能够区分何时创建子对象、何时更新子对象以及何时更新父对象。反正有这样做吗?我的直接目标是在创建新的子对象时推送广播。

尝试在子模型中使用 after_create 对我的目的不起作用,因为我试图在 application_controller.rb 中调用一个动作。

代码是我的父对象控制器是

if @parent_object.update_attributes(params[:parent_object])
  ...want the push_broadcast to go here if it's a new record. 

如果我使用调试器,params[:parent_object] 返回这个

{"overall_sharing"=>"1", "permissions_attributes"=>{"0"=>{"id"=>"66"}, "1"=>  {"can_edit"=>"1", "can_copy"=>"1", "_destroy"=>"false", "id"=>"74"}, "1341967403169"=>{"user_id"=>"171", "can_edit"=>"1", "can_copy"=>"1", "_destroy"=>"false", "note_id"=>"423"}}}

供参考,最后一位是新的子对象,第一位是更新父对象,中间是更新子对象。

我不知道正确的路径是尝试弄乱参数还是考虑不同的路径。任何建议将不胜感激。

谢谢,威尔斯

【问题讨论】:

    标签: ruby-on-rails-3 nested-forms update-attributes


    【解决方案1】:

    如果是新记录,则不会有 id。与编辑或更新时不同。

    试着找到它。如果你不能,那就是新的。

    if params[:id]
      #existing record
    else
      #new record
    end
    

    【讨论】:

    • 这是有道理的,但是使用 update_attributes 方法,我该怎么做呢?我的更新操作的控制器代码是@permission_set = PermissionSetting.find(params[:id]),此时@permission_set 只返回现有权限,然后@permission_set.update_attributes(params[:permission_setting]),此时@permission_set 返回所有权限,包括新权限(此时有一个id)
    【解决方案2】:

    Rails api 有一个 nice documentation 用于嵌套属性。 (在我看来,Rails 指南在这方面不足)。我认为它应该可以回答您的大部分问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-19
      • 1970-01-01
      • 2019-02-21
      • 1970-01-01
      • 2013-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多