Pergunta

Estou tentando salvar o usuário, mas quando salvo recebo o seguinte erro

AclNode :: Node () - Não conseguiu encontrar o nó ARO identificado por "Array ([aro0.model] => função [aro0.foreign_key] =>)"

Eu também recebo esse erro no topo

Índice indefinido:role_id [CORE\Cake\Model\AclNode.php, linha 140]

Eu não sei o que fazer quando adicionei as funções, elas foram adicionadas ao aros com facilidade, então por que agora isso está me causando problemas?

Eu segui o guia fornecido por

link

o que deveria ser simples, mas parece que não é tão simples.

No Papel Modelo

public $primaryKey = 'role_id';
public $displayField = 'role';
public $actsAs = array('Acl' => array('type' => 'requester'));

public function parentNode() {
   return null;
}

No Do utilizador Modelo

public $primaryKey = 'user_id';
public $displayField = 'username';

public function beforeSave($options = array()) {
        $this->data['User']['password'] = AuthComponent::password(
          $this->data['User']['password']
        );
        return true;
    }

    public $hasMany = array(
        'Role'   => array(
        'className' => 'Role',         
        'foreignKey' => 'role_id'
            )
        );

public $actsAs = array('Acl' => array('type' => 'requester'));

    public function parentNode() {
        if (!$this->id && empty($this->data)) {
            return null;
        }
        if (isset($this->data['User']['role_id'])) {
            $roleId = $this->data['User']['role_id'];
        } else {
            $roleId = $this->field('role_id');
        }
        if (!$roleId) {
            return null;
        } else {
            return array('Role' => array('id' => $roleId));
        }
    }

Meu código salvo para Do utilizador

public function add() {                  
//Populate roles dropdownlist        
        $data = $this->User->Role->find('list', array('fields' => array('role_id', 'role')));
        $this->set('roles', $data);

        if ($this->request->is('post')) {
            $this->User->ContactDetail->create(); 
            $this->User->ContactDetail->save($this->request->data);
            $this->request->data['User']['contact_detail_id'] = $this->User->ContactDetail->id;
            $this->User->Create();
            if ($this->User->save($this->request->data)) {
                $this->Session->setFlash(__('The user has been saved.'));
                return $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash(__('The user could not be saved. Please, try again.'));
            }
        }
    }
Foi útil?

Solução

Eu concordo com Jimmy, você deveria mudar o relacionamento para $belongsTo.Quando você salva o usuário, ele tenta salvar a tabela aros também, então você precisa modificar algumas alterações se não quiser que o usuário seja salvo no aros, apenas a função é suficiente para salvar a tabela aros (isso também é explicado no tutorial) , então veja as alterações que fiz nesses dois modelos.

O modelo de papel deve ser:

...
    public $hasMany = array(
        'User' => array(
            'className' => 'User',
            'foreignKey' => 'role_id',

        )
    );

    public $actsAs = array('Acl' => array('type' => 'requester'));

    public function parentNode() {
        return null;
    }
    ...

O modelo do usuário deve ser:

...

    public $belongsTo = array(
        'Role' => array(
            'className' => 'Role',
            'foreignKey' => 'role_id',
        )
    );


    public function bindNode($user) {
        return array('model' => 'Role', 'foreign_key' => $user['User']['role_id']);
    }
...

Conforme mostrado no código acima, public $actsAs = array('Acl' => array('type' => 'requester')); deve estar apenas no modelo de função, veja o relacionamento que adicionei e também veja as alterações nas funções parentNode e bindNode.

Tente isso e entre em contato comigo se houver alguma coisa.

Espero que ajude

Outras dicas

Com base no seu parentNode() métodos, presumo que você deva alterar o relacionamento no modelo User como:

public $belongsTo = array('Role');

Certifique-se também de que $this->request->data['User'] contém o campo role_id corretamente ao chamar $this->User->save($this->request->data) na ação add.

E uma pequena alteração:Use 'c' minúsculo em $this->User->Create(); :

$this->User->create();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top