#ruby-on-rails #controller
#ruby-on-rails #контроллер
Вопрос:
В моем приложении Rails 3.0 у меня есть серия очень больших форм поиска на моем ресурсе: индексная страница, требующая использования POST вместо GET.
В настоящее время приложение направляет запрос POST на ресурс #create, когда я хочу, чтобы он перенаправлялся на ресурс # index. Я понимаю, что это маршрут RESTful, но его нужно переопределить. Как я могу это сделать, сохраняя при этом возможность создания новой записи этого ресурса?
Большое спасибо.
Комментарии:
1. Не противоречит ли использование POST для формы поиска парадигме REST? Разве GET не был бы более подходящим?
2. GET, безусловно, более подходит, но ограничение длины URL слишком мало для всех параметров поиска.
Ответ №1:
Вам лучше выполнить действие «поиск», которое доступно только для post, а затем отображает шаблон индекса, например:
class MyController < ...
def search
@my_things = MyThing.find_with_search_params(params[:search])
render :action => :index
end
end
Ответ №2:
Вы можете использовать индекс, просто добавьте это в Rails 3 routes:
resources :my_things do
post :index
end
Комментарии:
1. не конфликтует ли созданный URL-адрес с методом create?
Ответ №3:
Итак, вы хотите, чтобы ваша конечная точка действия «создать» в контроллере выполняла две вещи — отвечала на поиск и также выполняла create? Плохая идея, но решение может быть таким же простым, как использование условия «если» в действии create для выполнения того или иного. Если это неудовлетворительный ответ, не стесняйтесь уточнить свой вопрос немного подробнее.
Комментарии:
1. Я вижу, что это плохая идея, и хотел бы избежать этого. Наверное, я надеялся, что существует решение для маршрутизации, а не использование контроллера create для обоих. Возможно, просто переместив URL для поиска со страницы индекса на что-то вроде resource / search или resource / all.
2. Если бы вы действительно были restful, это работало бы без проблем. URL-адрес /resources с GET нажмет на действие index и выполнит поиск, а / resources с POST нажмет на действие create и, что ж, выполнит create. Ваше представление должно гарантировать, что ссылка / кнопка поиска является методом GET, а create использует POST. Это решение для маршрутизации. /ресурсы с GET => index и / ресурсы с POST => create.