1

Я пытаюсь использовать accepts_nested_attributes_for в сочетании с has_many ассоциации и иметь много неприятностей ...Рельсы позволяют Вложенный массив

Вот упрощенная версия моего user.rb:

class User < ActiveRecord::Base 
    ... 
    has_many :user_permissions 
    accepts_nested_attributes_for :user_permissions 
    ... 
end 

Мой user_permission.rb:

class UserPermission < ActiveRecord::Base 
    belongs_to :user 
    ... 
end 

И мой users_controller.rb:

class UsersController < ApiController 
    ...  
    def update 
    @user.assign_attributes user_params 
    if @user.save 
     render partial: 'user', locals: { user: @user } 
    else 
     render json: {errors: @user.errors}.to_json, status: 500 
    end 
    end 
    ... 
private 
    def user_params 
    params.require(:user).permit(:first_name, :last_name, user_permissions_attributes: [ :user_id, :resource_id, :can_read, :can_update, :can_create, :can_delete ]) 
    end 
end 

Я ссылки this rails documentation о том, как использовать accepts_nested_attributes_for с сильными параметрами.

Однако, когда я ставит user_params "изнутри users_controller это все, что я не вижу (никаких ссылок на user_permissions):

{"first_name"=>"Joe", "last_name"=>"Shmoe"} 

Вот пример JSON я вношу на сервер (через угловой $ ресурса):

{ 
    "id": 10, 
    "first_name": "Joe", 
    "last_name": "Shmoe", 
    "user_permissions": [ 
    { 
     "organization_resource_id": 20, 
     "user_id": 10, 
     "can_update": true, 
     "can_read": true 
    }, 
    { 
     "organization_resource_id": 21, 
     "user_id": 10, 
     "can_create": true, 
     "can_read": true 
    } 
    ], 
} 

который возвращает этот JSON:

{ 
    "id": 10, 
    "first_name": "Joe", 
    "last_name": "Shmoe", 
    "user_permissions": [], 
} 

Я довольно уверен, что это проблема в моем рельсах слое, но только для справки здесь угловая user.js службы я создал, чтобы выполнить это RESTful взаимодействие с сервером:

angular.module('slics').service('User', [ 
    '$resource', function($resource) { 
    return $resource('/api/users/:id', { 
     id: '@id' 
    }, { 
     update: { 
     method: 'PUT', 
     isArray: false 
     } 
    }); 
    } 
]); 

На самом деле не конечно, что мне здесь не хватает. Кажется, что это трудно представить вложенные атрибуты ... но чем больше исследований я делаю, тем больше я понимаю, что это похоже на довольно распространенное разочарование Rails.

Пожалуйста, не стесняйтесь комментировать, если какой-либо дополнительный контекст/информация будет полезен для включения в описание проблемы, чтобы помочь устранить эту проблему, и я был бы рад предоставить ее!

ответ

1

Ну, вы отправляете массив хешей, а не хэш.

Так что этот код

user_permissions_attributes: [ :user_id, :resource_id, :can_read, :can_update, :can_create, :can_delete ] 

позволит такой структуре

{ 
    "id": 10, 
    "first_name": "Joe", 
    "last_name": "Shmoe", 
    "user_permissions_attributes": [  
     "organization_resource_id": 20, 
     "user_id": 10, 
     "can_update": true, 
     "can_read": true 
    ] 
} 

Try в белом список всего Params в "user_permissions"

user_permissions_attributes: [] 

Или проверить эту статью, чтобы узнать, как для создания передовых белых списков с помощью StrongParams http://patshaughnessy.net/2014/6/16/a-rule-of-thumb-for-strong-parameters

+0

Этот вызов 'allow' фактически не позволит использовать полезную нагрузку JSON, которую вы покажете в качестве примера. 'user_permissions_attributes' будет разрешено, но не' user_permissions'. – bschaeffer

+0

извините, мой плохой, исправленный –

1

Сильные параметры ожидаются user_permissions_attributes, и вы отправляете user_permissions.

Сильный PARAMS отдельно от accepts_nested_attributes_for (на самом деле, это не имеет ничего общего с ним), так, однако вы определяете require!/permit вызовов, как именно ваши атрибуты должны быть представлены.

ProTip: Чтобы сэкономить некоторое разочарование в будущем, если вы планируете обновлять через принимает вложенные атрибуты, вы, вероятно, хотите, чтобы разрешить :id а.

0

user_permissions_attributes: [: user_id,: o ID: can_read,: can_update,: can_create,: can_delete]) Разрешение: Идентификация и представление хэши со значением индекса ..

формат JSON представления к служат

"user": { 
    "id": 10, 
    "first_name": "Joe", 
    "last_name": "Shmoe", 
    "user_permissions": { 
    "0": { 
     "id": 20, 
     "user_id": 10, 
     "can_update": true, 
     "can_read": true 
     }, 
     "1": { 
     "id": 21, 
     "user_id": 10, 
     "can_create": true, 
     "can_read": true 
     } 
    } 
} 
Смежные вопросы