0

Каковы должны быть сильные параметры для моего chapters_controller, если у меня есть объект Book и объект Chapter?Rails Углеродистая проницаемость сильных параметров

Примечание: Я использую API JSON.

В моей chapters_controller должны мои сильные параметры будут:

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

Или она должна быть:

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

Если я использую :book вместо :book_id, то в моем приложении Ember, когда я иду чтобы создать новую главу, я могу ее создать и связать эту главу с родительской книгой, однако мой тест не выполнен:

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 

Я получаю ошибку в моей консоли, говорящей о несоответствии типа ассоциации.

Возможно, моя линия:

book: @book 

вызывает это?

В любом случае, ощущение кишки говорит мне, что я должен использовать :book в моих chapters_controller сильных параметрах.

Это просто мой тест не проходит, и я не уверен, как написать хэш параметров для моего теста.

ответ

0

Через несколько часов борьбы и глядя на API документов в формате JSON:

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

Он пришел к моему вниманию, для того, чтобы установить отношения belongsTo к сущности с JSON API, мы нужно сделать это:

POST /photos HTTP/1.1 
Content-Type: application/vnd.api+json 
Accept: application/vnd.api+json 

{ 
    "data": { 
    "type": "photos", 
    "attributes": { 
     "title": "Ember Hamster", 
     "src": "http://example.com/images/productivity.png" 
    }, 
    "relationships": { 
     "photographer": { 
     "data": { "type": "people", "id": "9" } 
     } 
    } 
    } 
} 

Это также привело меня к крепежным еще одна проблема у меня была в прошлом, которые я не мог исправить. Книги могут быть созданы с несколькими жанрами.

Структура API JSON для назначения массива Genre к Book сущности, мы заменим хеш данных с массивом данных в отношениях части, как это:

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

Additonally, в моих контроллеров, ничего сильного параметры, как так:

:title, :content, genre_ids: [] 

становится

:title, :content, :genres 

В соответствии с API JSON.

Так что для моих новых испытаний образцов DATAS теперь у меня есть:

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 

Специальное примечание о настройках отношения - только добавить relationships к params если есть отношения, в противном случае, установив ее на ноль говорит JSON API чтобы удалить это отношение, вместо того, чтобы игнорировать его.

Тогда я могу назвать мое испытание, как так:

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 
Смежные вопросы