2013-03-09 55 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 = {}