2014-12-30 2 views
0

У меня возникли проблемы с маршрутизацией кнопки, чтобы она вызывала действие в контроллере. Чтобы быть более точным, у меня есть эта линияbutton_to path routing in Rails

delete 'destroy/:id', to: 'users#admin_destroy'

в моем файле маршрута, и эта линия

%= button_to 'Destroy', destroy_path(user), data: { confirm: 'Are you sure?' } %>

в представлении.

Проблема заключается в том, что страница обрабатывает метод destroy_path как метод, и я не понимаю, какой должен быть правильный синтаксис. Что я недопонимаю?

Кроме того, я первоначально пытался получить эту работу как link_to, но я узнал, что это должно быть зарезервировано для запросов GET. Однако мне не нравится, как выглядит button_to, и мне интересно, есть ли способ сделать это как GET, чтобы вместо этого использовать link_to.

+0

Сообщение об ошибке будет полезно. Как вы заполняете 'user' (если это' @ user')? В строке маршрутов route.rb нет упоминания о пути url_helper, поэтому я не уверен, что вы можете использовать 'destroy_path', не связывая его с маршрутом. Каков результат «рейк-маршрутов»? – JTG

+0

И вы не должны использовать link_to/GET для действия, которое может изменить базу данных. Не вдаваясь слишком много в последствия для безопасности или как боты ищут сайт или идемпотентные действия, это действительно не рекомендуется, и вы будете лучше подготовлены к тому, чтобы узнать, как это сделать с правильным HTTP-глаголом и изменить внешний вид кнопки с помощью CSS. – JTG

+0

Спасибо за ответ! Я называю это '<% = render: partial => 'users/user',: collection => users%' в _user_list.html.erb (исходная строка destroy_path находится в _user.html.erb). Я бы предпочел не перечислять все маршруты рейка, так как он довольно большой, но я говорю, что я думаю, что destroy_path - это не то, что нужно связать с маршрутом уничтожения - я просто не знаю, что правый один есть. В настоящее время страница считает, что destroy_path - это метод и не знает, как его определить (поскольку это не метод, я просто догадался о синтаксисе маршрута). –

ответ

1

Я не уверен, если это будет полностью решить вашу проблему, но ... Вы можете определить пользовательский путь следующим образом:

в config/routes.rb

delete 'destroy/:id', to: 'users#admin_destroy', as: :destroy 

Это позволит использовать destroy_path в вашем приложении, и попросите его подключиться к вашему контроллеру пользователей с помощью функции admin_destroy.

Вы можете прочитать больше об этом here

+0

Спасибо - похоже, это работает, как только я добавлю «метод:: delete» в свою исходную строку представления. Я предполагаю, что это делает более ясным, что я просто перенаправляюсь на контроллер и запускаю соответствующий HTTP-метод, который я больше привык делать из php. Я освещен любопытством относительно того, почему мне нужен «как:: destroy», хотя ... разве это не значит, что нужно хорошо проложить маршрут? Если я уже идентифицирую button_to как delete и делаю это в представлении для пользовательского контроллера, зачем мне дополнительно определять 'destroy_path'? Есть ли какой-то предопределенный путь, который я не использую? –

+1

Так что Rails большая вещь - это соглашение по конфигурации. Таким образом, идея состоит в том, что когда вы выполняете «модели ресурсов» на своих маршрутах, он настраивает для вас все ваши пути CRUD и называет их соответствующим образом (я не думаю, что кто-то из них является файлом destroy_path). Однако, если вы решили создать собственный маршрут, как вы это делали, то rails не создает URL-адрес помощника, потому что он не знает, как его назвать, поэтому вы должны явно называть его самим с помощью: as: 'декларация. – JTG

+0

А, ладно. Спасибо, это было действительно полезно! –