Я разрабатываю веб-сайт Rails 2.3.1. На протяжении всего веб-сайта мне нужно иметь форму для создания сообщений на разных страницах (страница «Домашняя страница», «Создать сообщения», «Страница« Список публикаций »,« Страница комментариев »и т. Д.), Достаточно, чтобы заявить, что эта форма должна быть на многих страницах, обслуживаемых различные контроллеры). На каждой из этих страниц отображается большое количество другой информации, которая извлекается в соответствующем контроллере/действии. Например, на главной странице перечислены последние 10 сообщений, содержимое выведено из БД и т. Д.Лучшая практика Rails для получения одинаковой формы на нескольких страницах
Итак, я переместил форму создания Post в ее собственную частичную часть и включил это частичное на все необходимые страницы. Обратите внимание, что форма в Частичных POSTs/Вопросы (которые направляются на PostsController :: create - это поведение по умолчанию rails).
Проблема, с которой я столкнулся, - это когда форма сообщений заполнена неправильно, по умолчанию заданы вопросы PostsController :: create method render/new.html.erb, даже если форма была отправлена с домашней страницы (/ главная/index.html.erb).
Я попытался изменить форму в частичном представлении «подчиняющего_контроллера» и «подчинения_имен», а в PostsController :: create, когда @ post.save? == false, я выношу action => "../submitting_controller/submitting_action" (что немного взломанно, но позволяет отображать действия из не-PostsController).
Это, казалось, работало нормально на поверхности. Неполная форма была отображена в представлении, которое отправило его со всем правильным сообщением @ post.errors и т. Д. Проблема была ВСЕ, другие данные на страницах не отображались, потому что фактические методы отправки_controller/submitting_action не вызывались, просто соответствующий вид. (Remeber, я сделал рендер, который сохраняет объекты экземпляра, а не redirect_to, который не сохраняет объект экземпляра @post, который имеет все сообщения об ошибках и представленные значения.)
Насколько я вижу, у меня есть два варианта :
1) Я могу хранить объект @post в сеансе, когда @ post.save? fail в PostsController :: create, redirect_to submitting_controller/submitting_action, после чего я вытаскиваю объект @post из сеанса и использую его для повторного заполнения сообщений формы/ошибки. (Насколько я понимаю, хранение объектов в сеансе является практикой BAD в рельсах)
2) Я могу переместить всю логику, используемую для вытягивания данных формы, отличных от поста, от различных подчиняющихся_controller/submitting_action, поместив их в ApplicationController, создайте гигантский оператор switch в PostsController :: create for submitting_controller/submitting_action и вызовите методы в ApplicationController, чтобы захватить все дополнительные данные, необходимые для каждого рендеринга страницы отправки.
Мысли о лучшем способе сделать это в Rails?
Emfi, Хороший пункт о вложенных атрибутах. Это не пришло мне в голову. Также важно то, что вы делаете о дефолте не-JS. Чувство, которое я испытываю, заключается в том, что вопросник (из-за отсутствия лучшего дескриптора) в конечном итоге повредит производительность приложения за счет количества действий БД, которое ему необходимо выполнить для восстановления всех объектов. – robertpostill
На этом мы согласны. Однако разница между не-javascript и AJAX обычно представляет собой вызов link_to_remote, RJS, который отображает шаблон, и, возможно, небольшую логику контроллера, чтобы избежать запросов к базе данных, которые вы обычно делаете иначе. – EmFi
EmFi, к сожалению модель Post и модели, которые контроллер, который вы будете использовать для визуализации формы, могут не иметь отношения. (HomeController не имеет модели поддержки даже). Я делаю некоторую проверку механизма captcha в PostController :: create (поле captcha не является частью Post Model, а скорее его собственным модулем). Я думаю, что вы и Робертпостилл правы в AJAX - это способ решить эту проблему.Мне просто нужно выяснить, как это сделать с помощью jQuery (я отказался от использования прототипа, личного префайла), а не в том, чтобы делать что-либо в Rails. – empire29