0

Was sollten die starken Parameter für meine chapters_controller sein, wenn ich eine Book Einheit und eine Einheit habe?Schienen Ember starke Parameter Klarstellung

Hinweis: Ich verwende JSON API.

In meinen chapters_controller sollen meine starken Parameter sein:

:title, :order, :content, :published, :book, :picture 

Oder sollte es sein:

:title, :order, :content, :published, :book_id, :picture 

Wenn ich :book statt :book_id verwende, dann in meiner Ember Anwendung, wenn ich gehe, um ein neues Kapitel zu erstellen, kann ich es erstellen und dieses Kapitel dem übergeordneten Buch zuordnen, jedoch schlägt mein Test fehl:

def setup 
    @book = books(:one) 

    @new_chapter = { 
    title: "Cooked Wolf Dinner", 
    order: 4, 
    published: false, 
    content: "The bad wolf was very mad. He was determined to eat the little pig so he climbed down the chimney.", 
    book: @book 
    } 
end 

def format_jsonapi(params) 
    params = { 
    data: { 
     type: "books", 
     attributes: params 
    } 
    } 
    return params 
end 

... 

test "chapter create - should create new chapter assigned to an existing book" do 
    assert_difference "Chapter.count", +1 do 
    post chapters_path, params: format_jsonapi(@new_chapter), headers: user_authenticated_header(@jim) 
    assert_response :created 

    json = JSON.parse(response.body) 

    attributes = json['data']['attributes'] 

    assert_equal "Cooked Wolf Dinner", attributes['title'] 
    assert_equal 4, attributes['order'] 
    assert_equal false, attributes['published'] 
    assert_equal @book.title, attributes['book']['title'] 
    end 
end 

Ich bekomme einen Fehler in meiner Konsole sagen Association-Typ-Mismatch. meine Linie

Vielleicht:

book: @book 

verursacht es?

Wie auch immer, Bauchgefühl sagt mir, ich sollte :book in meinem chapters_controller starken Parameter verwenden.

Es ist nur mein Test ist nicht bestanden, und ich bin mir nicht sicher, wie man den Parameter Hash für meinen Test zu übergeben.

Antwort

0

Nach ein paar Stunden des Kampfes und der Blick auf die API-Dokumentation JSON:

http://jsonapi.org/format/#crud-creating

es zu meiner Aufmerksamkeit gekommen ist, um eine belongsTo Beziehung zu einer Einheit mit JSON API zu setzen, wir muss dies tun:

Dies führte mich auch zur Behebung eines anderen Problems, das ich in der Vergangenheit hatte, die ich nicht beheben konnte. Bücher können mit mehreren Genres erstellt werden.

Die API Struktur JSON für ein Array von Genre zu einer Book Entität Zuweisen ersetzen wir die Daten-Hash mit einem Daten-Array in der Beziehung Teil so:

"data": [ 
    { "type": "comments", "id": "5" }, 
    { "type": "comments", "id": "12" } 
] 

Additonally, meinen Controller, etwas starken Parameter wie folgt:

:title, :content, genre_ids: [] 

Wird

:title, :content, :genres 

Um die JSON-API zu erfüllen.

Also für meine neue Testprobe Daten habe ich jetzt:

def setup 
    ... 
    @new_chapter = { 
    title: "Cooked Wolf Dinner", 
    order: 4, 
    published: false, 
    content: "The bad wolf was very mad. He was determined to eat the little pig so he climbed down the chimney.", 
    } 
    ... 
end 

def format_jsonapi(params, book_id = nil) 
    params = { 
    data: { 
     type: "chapters", 
     attributes: params 
    } 
    } 

    if book_id != nil 
    params[:data][:relationships] = { 
     book: { 
     data: { 
      type: "books", 
      id: book_id 
     } 
     } 
    } 
    end 

    return params 
end 

Besonderer Hinweis auf die Beziehung Einstellungen - nur relationships-params hinzufügen, wenn es eine Beziehung gibt, sonst ist es zu null Einstellung sagt JSON API um diese Beziehung zu entfernen, anstatt sie zu ignorieren.

Dann kann ich meinen Test nennen wie so:

test "chapter create - should create new chapter assigned to an existing book" do 
    assert_difference "Chapter.count", +1 do 
    post chapters_path, params: format_jsonapi(@new_chapter, @book.id), headers: user_authenticated_header(@jim) 
    assert_response :created 

    json = JSON.parse(response.body) 

    attributes = json['data']['attributes'] 

    assert_equal "Cooked Wolf Dinner", attributes['title'] 
    assert_equal 4, attributes['order'] 
    assert_equal false, attributes['published'] 
    assert_equal @book.id, json['data']['relationships']['book']['data']['id'].to_i 
end 
Verwandte Themen