2013-03-09 58 views
3

对于js和angular来说我相当新,但是我在Rails + AngularJS(http://railscasts.com/episodes/405-angularjs?autoplay=true)上观看Ryan Bates的railscast之后试图让Rails应用程序工作。使用Rails和AngularJS进行嵌套式表单的困难

我相信我想要做的事情很简单:我有一个Place模型,有很多电话,我想动态地添加和保存电话时创建一个新的地方。这种类型的嵌套表单在Rails中是相当容易的(当用户添加一个Phone时,js只创建一个新的字段元素),但是我想在Angular中做到这一点。

我想我的问题然后分解为两个: 1)在Rails + AngularJS(甚至一般的表单)中创建嵌套表单的最佳做法是什么?现在我通过JSON将每个模型传递给Angular,但这是最好的方法吗?

我的第二个问题涉及以下代码。

我试图做到这一点,我能救一个地方的角度:

places_controller.rb

respond_to :json 
def create 
    respond_with Place.create(params[:place]) 
end 

_form.html.erb

<div class="container-fluid" ng-controller="PlaceCtrl"> 
    <form ng-submit="addPlace()"> 
    <div class="row-fluid"> 
     <div class="span2"><label>Name</label></div> 
     <div class="span8"><input type="text" class="input-xlarge" ng-model="newPlace.name"></div> 
    </div> 
    <input type="submit" class="btn" value="Add"> 
    </form> 
</div> 

地方。 js.coffee

app = angular.module("test", ["ngResource"]) 

app.factory "Place", ($resource) -> 
    $resource("/places/:id", {id: "@id"}, {update: {method: "PUT"}}) 

app.factory "Phone", ($resource) -> 
    $resource("/phones/:id", {id: "@id"}, {update: {method: "PUT"}}) 

@PlaceCtrl = ($scope, Place, Phone) -> 

    $scope.addPlace = -> 
    place = Place.save($scope.newPlace) 
    console.log place 
    $scope.newPlace = {} 

in place.js.coffee我可以将位置保存到数据库中(place = Place.save($ scope.newPlace))。我需要地点的ID,以便我可以将其附加到动态构建的所有电话(因为电话具有指向地点的place_id的FK)。但是,如果我在控制台中键入place.id,则会收到未定义的消息。 place.name将返回该地点的名称,但id不起作用。但是,如果我查看console.log位置,则会看到id字段已返回并填充。

2)如何获取地点JSON对象的id字段?我几乎肯定这是可能的,因为Chrome的控制台返回id字段,但place.id不会给我任何东西。

非常感谢您的帮助。我非常感谢。

+0

'location'是使用,可以运行与'window.location'冲突糟糕的变量名。做一个网页搜索javascript保留关键字 – charlietfl 2013-03-09 23:57:47

+0

谢谢你的头。位置实际上不是我正在使用的变量。我只是用它来举例。 – Robert 2013-03-10 00:01:24

+0

也有点令人困惑,因为我相信你使用'Location'作为对象的实际地址字段的引用,而不是浏览器'location'或角度'$ location',它们是'url'相关的。所以不完全确定你指的是 – charlietfl 2013-03-10 00:15:39

回答

0

我会尝试这样的事:

$scope.addPlace = -> 
    place = Place.save($scope.newPlace) -> 
    $scope.newPlaceId = place.id 
    console.log place 
    $scope.newPlace = {}