2015-02-09 10 views
5

Sono nuovo di Angular. Ho provato tutto ciò che so e le ricerche di Google hanno sorprendentemente pochi tutorial su questa particolare domanda. Ecco l'ultimo codice ho provato:Come posso salvare un modulo Angolare sul mio Ruby sul back-end delle guide?

index.html

<form ng-submit="addArticle(articles)"> 
<input type="text" id="title" ng-model="newPost.title"> 
<input type="text" id="body" ng-model="newPost.body"> 
<input type="submit" value="Submit"> 
</form> 

articoli regolatore

app.controller('ArticlesCtrl', function($scope, Article) { 
    $scope.articles = Article.query(); 
    $scope.newPost  = Article.save(); 
}); 

articoli di servizio (rotaie backend)

app.factory('Article', function($resource) { 
    return $resource('http://localhost:3000/articles'); 
}); 

posso recuperare i dati più che bene. Ma non posso inviare nuovi dati al back-end delle binari. Al caricamento della pagina, l'errore guide del server è:

Started POST "/articles" for 127.0.0.1 at 2015-02-08 18:26:29 -0800 
Processing by ArticlesController#create as HTML 
Completed 400 Bad Request in 0ms 

ActionController::ParameterMissing (param is missing or the value is empty: article): 
    app/controllers/articles_controller.rb:57:in `article_params' 
    app/controllers/articles_controller.rb:21:in `create' 

Premendo il pulsante di invio non fa niente per niente. Il modulo in pratica non funziona e la pagina sta cercando una presentazione non appena viene caricata.

Capisco cosa dice l'errore, che non riceve i parametri dal modulo. Quello che non capisco è come dovrebbe apparire nel mio controller e/o nella mia forma.

Cosa sto facendo male e come posso risolvere questo problema?

risposta

7

Angolare ha una funzionalità denominata services che funge da modello per l'applicazione.E 'dove sto comunicando con il mio Rails backend:

servizi/article.js

app.factory('Article', function($resource) { 
    return $resource('http://localhost:3000/articles/:id', { id: '@id'}, 
    { 
    'update': { method: 'PUT'} 
    }); 
}); 

Anche se il :id è specificato alla fine, funziona altrettanto bene per andare dritto al /articles sentiero. Il id verrà utilizzato solo dove previsto.

Il resto del lavoro va nel controllore:

controllori/articles.js

app.controller('NewPostCtrl', function($scope, Article) { 
    $scope.newPost = new Article(); 

    $scope.save = function() { 
    Article.save({ article: $scope.article }, function() { 
     // Optional function. Clear html form, redirect or whatever. 
    }); 
    }; 

}); 

originale, ho pensato che la funzione save() che è reso disponibile tramite $resources era alquanto automatico. Lo è, ma lo stavo usando male. La funzione predefinita save() può richiedere fino a quattro parametri, ma sembra richiedere solo che i dati vengano passati al database. Qui, è in grado di inviare una richiesta POST al mio back-end.

viste/articoli/index.html

<form name="form" ng-submit="save()"> 
    <input type="text" id="title" ng-model="article.title"> 
    <input type="text" id="body" ng-model="article.body"> 
    <input type="submit" value="Submit"> 
</form> 

Dopo avere ottenuto l'impostazione service correttamente, il resto è stato facile. Nel controller, è necessario creare una nuova istanza della risorsa (in questo caso, un nuovo articolo). Ho creato una nuova variabile $scope che contiene la funzione che richiama il metodo save che ho creato nello service.

Ricordare che i metodi creati nel servizio possono essere denominati come si desidera. L'importanza di questi è il tipo di richiesta HTTP inviata. Ciò è particolarmente vero per qualsiasi app RESTful, poiché la route per le richieste GET è la stessa delle richieste POST.

Di seguito è la prima soluzione che ho trovato. Grazie ancora per le risposte. Sono stati utili nei miei esperimenti per imparare come funzionava!

soluzione originale: ho finalmente riparato, quindi vi posto la mia soluzione particolare. Tuttavia, ho solo seguito questa strada attraverso la mancanza di informazioni su come eseguirlo attraverso un angolare service. Idealmente, un servizio gestirà questo tipo di richiesta http. Si noti inoltre che quando si utilizza $resource nei servizi, viene fornito con alcune funzioni, una delle quali è save(). Tuttavia, anche questo non ha funzionato per me.

articoli.js controller

app.controller('FormCtrl', function($scope, $http) { 
$scope.addPost = function() { 
$scope.article = { 
    'article': { 
    'title' : $scope.article.title, 
    'body' : $scope.article.body 
    } 
}; 

// Why can't I use Article.save() method from $resource? 
    $http({ 
     method: 'POST', 
     url: 'http://localhost:3000/articles', 
    data: $scope.article 
    }); 
}; 

});

Dal Rails è il backend, inviando una richiesta POST al percorso /articles richiama il metodo #create. Questa è stata una soluzione più semplice per me da capire rispetto a quello che stavo provando prima.

Per capire utilizzando services: il $resource consente di accedere alla funzione save(). Tuttavia, non ho ancora demistificato come usarlo in questo scenario. Sono andato con $http perché la sua funzione era chiara.

Sean Hill ha una raccomandazione che è la seconda volta che ho visto oggi. Potrebbe essere utile a chiunque stia combattendo con questo problema. Se mi imbatto in una soluzione che utilizza servizi, aggiornerò questo.

Grazie a tutti per il vostro aiuto.

0

Fino a quando i campi di input sono vuoti, nessun valore è memorizzato nel modello e POST svuota l'oggetto dell'articolo. È possibile risolvere il problema creando la convalida lato client o impostando il valore di stringa vuota predefinito sui campi necessari prima del salvataggio.

Prima di tutto è necessario creare nuovo oggetto articolo variabile portata poi passare newPost da params o accedere direttamente $scope.newPost in addArticle fn:

app.controller('ArticlesCtrl', function($scope, Article) { 
    $scope.articles = Article.query(); 
    $scope.newPost = new Article(); 

    $scope.addArticle = function(newPost) { 
    if (newPost.title == null) { 
     newPost.title = ''; 
    } 
    // or if you have underscore or lodash: 
    // lodash.defaults(newPost, { title: '' }); 
    Article.save(newPost); 
    }; 
}); 

Se si desidera utilizzare le operazioni CRUD si dovrebbe risorse di impostazione come qui di seguito:

$resource('/articles/:id.json', { id: '@id' }, { 
    update: { 
    method: 'PUT' 
    } 
}); 
2

Ho lavorato molto con Angular and Rails e consiglio vivamente di utilizzare AngularJS Rails Resource. Rende molto più facile lavorare con un backend Rails.

https://github.com/FineLinePrototyping/angularjs-rails-resource

Sarà necessario specificare questo modulo nel dipendenze dell'app e quindi avrete bisogno di cambiare la vostra fabbrica per assomigliare a questo:

app.factory('Article', function(railsResourceFactory) { 
    return railsResourceFactory({url: '/articles', name: 'article'); 
}); 

In sostanza, in base all'errore che si stanno ottenendo, ciò che sta accadendo è che la tua risorsa non sta creando il parametro corretto article. AngularJS Rails Resource lo fa per te, e si prende anche cura del comportamento specifico di Rails.

Inoltre, $scope.newPost non deve essere Article.save(). Dovresti inizializzarlo con una nuova risorsa new Article().

Problemi correlati