Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Setting id in ember data with createRecord

If I try to create a record with something like

var myObject = App.ModelName.createRecord( data );
myObject.get("transaction").commit();

the id of myObject is never set.

This says that id generation should be handled by EmberData (first response). So what should be happening? Where is the new id determined. Shouldn't there be a callback to the API to get valid id?

like image 707
onezeno Avatar asked Oct 04 '22 20:10

onezeno


2 Answers

ID is the primary key for your record which is created by your database, not by Ember. This is JSON structure submit to REST post, notice no ID.

{"post":{"title":"c","author":"c","body":"c"}}

At your REST Post function you must get the last insert ID and return it back with the rest of the model data to Ember using this following JSON structure. Notice the ID, that is the last insert ID. You must get that last insert ID manually using your DB api.

{"post":{"id":"20","title":"c","author":"c","body":"c"}}

This is my sample code for my REST post. I coded this using PHP REST Slim framework:

$app->post('/posts', 'addPost'); //insert new post

function addPost() {
    $request = \Slim\Slim::getInstance()->request();
    $data = json_decode($request->getBody());

    //logging json data received from Ember!
    $file = 'json1.txt';
    file_put_contents($file, json_encode($data));
    //exit;

    foreach($data as $key => $value) {
        $postData = $value;
    }

    $post = new Post();
    foreach($postData as $key => $value) {

        if ($key == "title")
            $post->title = $value;

        if ($key == "author")
            $post->author = $value;

        if ($key == "body")
            $post->body = $value;   
    }

    //logging
    $file = 'json2.txt';
    file_put_contents($file, json_encode($post));

    $sql = "INSERT INTO posts (title, author, body) VALUES (:title, :author, :body)";

    try
    {
        $db = getConnection();
        $stmt = $db->prepare($sql);
        $stmt->bindParam("title", $post->title);
        $stmt->bindParam("author", $post->author);
        $stmt->bindParam("body", $post->body);
        $stmt->execute();

        $insertID =  $db->lastInsertId(); //get the last insert ID
        $post->id = $insertID;

        //prepare the Ember Json structure
        $emberJson = array("post" => $post);

        //logging
        $file = 'json3.txt';
        file_put_contents($file, json_encode($emberJson));

        //return the new model back to Ember for model update
        echo json_encode($emberJson);
    }
    catch(PDOException $e)
    {
        //$errorMessage = $e->getMessage();
        //$data = Array(
        //  "insertStatus" => "failed",
        //  "errorMessage" => $errorMessage
        //);
    }
}
like image 67
jumper rbk Avatar answered Oct 07 '22 20:10

jumper rbk


With some REST adapters, such as Firebase, you can define the id as a variable of the record you are going to create.

App.User = DS.Model.extend({
  firstName: DS.attr('string')
});

var sampleUser = model.store.createRecord('user', {
  id: '4231341234891234',
  firstName: 'andreas'
});

sampleUser.save();

JSON in the database (Firebase)

"users": {
  "4231341234891234": {
    "firstName": "andreas"
  }
}
like image 22
Arubaruba Avatar answered Oct 07 '22 20:10

Arubaruba