当我试图指定规则集时,form_validation错误

I have research on their documentation, but why does this code won't work? Can someone help me?

    $valid = array(
        'menu' => array(
                'field' => 'menu',
                'label' => 'Menu',
                'rules' => 'required'
        ),
        'access_menu' => array(
                'field' => 'access_menu_id',
                'label' => 'Access Menu ID',
                'rules' => 'required'
        )
    );
    $this->form_validation->set_rules($valid);

    if($this->form_validation->run() == false) {
        $this->load->view('templates/header', $data);
        $this->load->view('templates/sidebar', $data);
        $this->load->view('templates/topbar', $data);
        $this->load->view('menu/index', $data);
        $this->load->view('templates/footer');
    }elseif($this->form_validation->run('menu')){
        if($this->input->post('id') > 0) {
            $this->Menu_model->editMenu($this->input->post());
            redirect('menu');
        }else{
            $this->Menu_model->addMenu($this->input->post());
            $this->session->set_flashdata('message1', '<div class="alert alert-success" role="alert">
                Menu added.
            </div>');
            redirect('menu');
        }
    }elseif($this->form_validation->run('access_menu')) {
        if($this->input->post('access_id') > 0) {
            $this->Menu_model->editAccessMenu($this->input->post());
            redirect('menu');
        }else{
            $this->Menu_model->addAccessMenu($this->input->post());
            $this->session->set_flashdata('message2', '<div class="alert alert-success" role="alert">
                Menu added.
            </div>');
            redirect('menu');
        }
    }

The results always The Menu field is required. When I have clearly input access_menu_id

I think this happens on the first validation run. It's stated that "The Menu field is required", and by seeing at the $_POST output, you haven't send any menu field yet.
If you want to make either menu or access_menu custom rule works, you could reorder the $this->form_validation->run() == false condition as the last validation :

if($this->form_validation->run('menu')){
    if($this->input->post('id') > 0) {
        $this->Menu_model->editMenu($this->input->post());
        redirect('menu');
    }else{
        $this->Menu_model->addMenu($this->input->post());
        $this->session->set_flashdata('message1', '<div class="alert alert-success" role="alert">
            Menu added.
        </div>');
        redirect('menu');
    }
}elseif($this->form_validation->run('access_menu')) {
    if($this->input->post('access_id') > 0) {
        $this->Menu_model->editAccessMenu($this->input->post());
        redirect('menu');
    }else{
        $this->Menu_model->addAccessMenu($this->input->post());
        $this->session->set_flashdata('message2', '<div class="alert alert-success" role="alert">
            Menu added.
        </div>');
        redirect('menu');
    }
} elseif($this->form_validation->run() == false) {
    $this->load->view('templates/header', $data);
    $this->load->view('templates/sidebar', $data);
    $this->load->view('templates/topbar', $data);
    $this->load->view('menu/index', $data);
    $this->load->view('templates/footer');
}

Edit : Sorry, it doesn't work even if i rearrange it like the code below, it still shows the "The Menu field is required".

$valid = array(
        'menu' => array(
                'field' => 'menu',
                'label' => 'Menu',
                'rules' => 'required'
        ),
        'access_menu' => array(
                'field' => 'access_menu_id',
                'label' => 'Access Menu ID',
                'rules' => 'required'
        )
    );
    $this->form_validation->set_rules($valid);

    if($this->form_validation->run('access_menu')) {
        if($this->input->post('access_id') > 0) {
            $this->Menu_model->editAccessMenu($this->input->post());
            redirect('menu');
        }else{
            $this->Menu_model->addAccessMenu($this->input->post());
            $this->session->set_flashdata('message2', '<div class="alert alert-success" role="alert">
                Menu added.
            </div>');
            redirect('menu');
        }
    }elseif($this->form_validation->run() == false) {
        $this->load->view('templates/header', $data);
        $this->load->view('templates/sidebar', $data);
        $this->load->view('templates/topbar', $data);
        $this->load->view('menu/index', $data);
        $this->load->view('templates/footer');
    }else{
        if($this->input->post('id') > 0) {
            $this->Menu_model->editMenu($this->input->post());
            redirect('menu');
        }else{
            $this->Menu_model->addMenu($this->input->post());
            $this->session->set_flashdata('message1', '<div class="alert alert-success" role="alert">
                Menu added.
            </div>');
            redirect('menu');
        }
    }