2010-02-01 2 views
0

Я пытаясь выполнить запрос AJAX в представлении, пользователь дает некоторый ввод, который отправляется на сервер с AJAX, и функция, к которой он должен идти, маршрутизируется с помощью CodeIgniters маршрутов.Проблема маршрутизации CodeIgniter. (добавляет маршрут ajax к существующему url)

Это представление, в котором я сейчас работаю, делая запрос.

http://localhost:8888/companies/list 

В моем маршруте конфигурации я установил этот маршрут ниже, чтобы справиться с AJAX-запрос, который должен быть в состоянии прийти с любой точки зрения и по-прежнему быть в состоянии пойти на маршрут я указал.

$route['test_ajax'] = "ajax/test_ajax"; 

Так запрос должен перейти к «Аяксу» -controller и использовать функцию «test_ajax», который должен сделать POST-URL выглядеть следующим образом.

POST http://localhost:8888/test_ajax 

Но вместо того, что я получаю текущий URL я стою на, и маршрут я указал добавляется к URL разбивая мой ответ от AJAX-запроса полностью, так как он даже не пошел близко к функции, которой он должен был. POST-url, который я получаю, выглядит так.

POST http://localhost:8888/companies/test_ajax 

Обратите внимание, что параметр/компании удален. Аргумент/список был потерян где-то, хотя, если я добавлю косые черты после списка, я получу и аргумент списка в URL.

Итак, что произошло, POST пытается перейти к контроллеру компаний и искать функцию test_ajax, которая определена в контроллере ajax, а не в компании-контроллере. Эта ошибка сохраняется независимо от того, на каком URL я нахожусь, и она всегда следует той же схеме. Он продолжает добавлять URL-адрес маршрута к существующему URL вместо правильной маршрутизации.

Итак, что может привести к тому, что маршрутизация будет вести себя таким образом, есть ли какие-либо настройки, которые случайно включены или что-то еще? Потому что я знаю, что у меня это есть сотни раз в предыдущих проектах.

Заранее благодарен.

ответ

6

Это потому, что ваш Javascript использует текущий каталог в качестве базы и добавляет к нему URL AJAX. Поскольку вы находитесь (по крайней мере, на стороне клиента) в каталоге компаний, он добавляет ваш URL-адрес в это.

Решение, если ваш Javascript инлайн, чтобы просто использовать base_url() PHP функции wihtin кода ...

var url = '<?= base_url(); ?>test_ajax/'

Если Javascript не рядный, вы можете объявить глобальный переменная в верхней части HTML-документа с помощью функции PHP ...

var BASE_URL = '<?= base_url(); ?>'

И использовать его везде в вашем Javascript ...

var url = BASE_URL + 'test_ajax/'

В качестве альтернативы, вы можете просто жёстко базовый URL, но это может получить реальный грязный очень быстро.

+0

Чтобы использовать 'base_url' в CodeIgniter, убедитесь, что у вас есть загруженный URL-адрес. – beseku

+0

Это работает, но только потому, что я полностью игнорирую маршруты и просто использую для этого обычный URL. Я бы хотел, чтобы весь URL-адрес был направлен для структуры. Но у вас наверняка есть смысл. –

+0

@beseku, как я могу использовать PHP-код, если я поместил все js в внешний файл js? – palAlaa

1

Оказывается, CodeIgniter интерпретировал это как относительную ссылку из-за отсутствия косой черты. В Руководстве пользователя CodeIgniter указано, что в конфигурации маршрутов не должно быть написано ни заголовка, ни конечных косых черт.

То, что это решило, заключалось в добавлении косой черты в java-URL.

$.ajax({ 
    url: "/test_ajax", 
    type: "POST", 
    data: data, 
    success: function(data){ 
     console.log(data); 
    } 
}); 

Это заставляет CI интерпретировать это как абсолютный URL-адрес и дает мне URL-адрес, который я искал.

POST http://localhost:8888/test_ajax 
+0

Остерегайтесь, что это означает, что если вы когда-нибудь переместите приложение из корня, то ваш JS сломается. То есть весь смысл помощников base_url и site_url. – beseku

+0

Он не сломается, так как я его проложил, и это остается в структуре CI. Если я переведу это на другой URL-адрес, я получу только http://www.othersite.com/test_ajax Маршрут по-прежнему будет маршрутизироваться внутри CI и найти его способ/test_ajax. Я уже пробовал, и он работает. Но только потому, что CI использует настройку base_url, о которой вы говорите. Еще раз, спасибо за помощь! –

Смежные вопросы