【问题标题】:How to wrap an object around my data when using Angular $resource使用Angular $resource时如何在我的数据周围包装一个对象
【发布时间】:2015-06-29 18:44:25
【问题描述】:

我有一个简单的 Angular 服务,它返回 $resource。假设它看起来像这样:

$resource '/users/:id/:options.json', {id: '@id', options: '@options'},
            create_user: {
                method: 'POST'
            }

现在在我的控制器中,我通过创建用户服务的新实例来使用此资源:

user = new UserService()
                user.name = $scope.user.name
                user.email = $scope.user.email
                user.password = $scope.user.password
                user.password_confirmation = $scope.user.password_confirmation
                user.$create_user()

但是当执行最后一行时,数据被发送了,但它不在对象中。

现在我让 Devise 管理我的用户帐户并查看他们的注册控制器,他们似乎希望我将数据发送到一个名为:sign_up 的对象中。

我如何在$resource 中描述我希望将我的数据封装在我的自定义对象中?

编辑:这是服务器得到的。它对此不满意,并说缺少每个值。

Parameters: {"name"=>"foo", "email"=>"foo@bar.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "registration"=>{"name"=>"foo", "email"=>"foo@bar.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}}

EDIT2:.erb 注册的工作服务器日志:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"xMEDtMWf72yuTwbkaq21c0ZKynoBSWnSypXfm+xJYvNph1d4iKqLIBwwe0DSA3I/YCU+pAHDd23ylc4y7ximEQ==", "user"=>{"name"=>"lol", "email"=>"lol@lol.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Sign up"}

【问题讨论】:

    标签: ruby-on-rails angularjs devise angular-resource


    【解决方案1】:

    我建议在该路线上使用 transformRequest。您的代码看起来像这样。

    $resource('/users/:id/:options.json',
              {id: '@id', options: '@options'},
              {
                  create_user: {
                      method: 'POST', 
                      transformRequest: function(data, headers) {
                          return angular.toJson({
                              user: data
                          });
                      }
                  }
              });
    

    这允许您更改正在发送的数据。传递给 transformRequest 的数据对象是您的 User 对象。标头已经包含 Content-Type application/json,因此您无需在此处添加。

    【讨论】:

    • 我喜欢这个。谢谢你的回答!
    【解决方案2】:

    这应该可行:

    var User = $resource(
         '/users/:id/:options.json', {id: '@id', options: '@options'},
         create_user: {
             method: 'POST'
         }
    );
    
    User.create_user({user: $scope.user});
    

    【讨论】:

    • 编辑了我的答案。还是同样的问题。 $resource 构造函数中的第一个参数也不应该用于 URL 变量吗?
    • 所以问题出在服务端而不是客户端,服务端代码是什么?
    • 对原始帖子进行了另一次编辑。如您所见,服务器希望将其包装在“用户”对象中。
    • 这样包装:User.create_user({user: $scope.user})(答案已编辑)
    • 这确实有效,但是当我有更复杂的数据并对其进行深度嵌套时,它似乎会导致问题,因为这样 Angular 将无法知道什么是什么以及什么去哪里。这就是为什么我使用我在回答中显示的表格。你会碰巧知道如何以这种方式做同样的事情吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 2022-01-15
    • 2013-03-21
    相关资源
    最近更新 更多