#ruby-on-rails #forms
#ruby-on-rails #формы
Вопрос:
Я пытаюсь создать форму на странице индекса моего веб-приложения. Прямо сейчас у меня есть вызываемый контроллер home_controller.rb
и вызываемое представление index.html.erb
. Эти двое прямо сейчас обрабатывают «индекс» моего сайта. Я также пытаюсь добавить форму на эту страницу. Содержимое index.html.erb
является:
<%= form_tag(query_path, :method => "get") do %>
<%= submit_tag("Go!") %>
<% end %>
Однако rails выдает мне эту ошибку при загрузке страницы:
неопределенная локальная переменная или метод `query_path’
Вот что, я думаю, я хочу, чтобы произошло: я хочу другое действие, в home_controller.rb
котором вызывается query
(прямо сейчас единственное действие в этом контроллере — это index
). Это query
действие вызывается из моей формы при нажатии кнопки «Перейти»! Как мне это сделать? Что должно быть там вместо query_path
?
Редактировать:
Я чувствую, что на это должен быть более простой ответ, а не изменять routes.rb
файл. Почему я неправильно думаю об этом бизнесе маршрутизации? На мой взгляд, любое действие на моей странице должно по умолчанию выполняться контроллером для существующей страницы. Итак, если я нахожусь на своей index.html.erb
странице, которая принадлежит my home_controller.rb
, my :action => 'query'
должен по умолчанию искать действие в my home_controller.rb
. Почему этого не происходит?Это именно то, чего я хочу добиться.
Возможно, я думаю об этом совершенно неправильно, поэтому мы вместе взламываем решение. Вот что я хочу: я хочу, чтобы пользователь нажал кнопку, которая заставляет приложение запрашивать внешний API, получать некоторый JSON и отображать содержимое JSON. На мой взгляд, это означало, что кнопка переходит к другому действию в моем том же контроллере, который запрашивает внешний API и передает JSON обратно для отображения на той же странице (все это с помощью Ajax). Я неправильно подхожу к этой проблеме?
Комментарии:
1. Что это за версия rails?
2. 3.0.7 (#FILLERTEXTISANNOYING)
Ответ №1:
Похоже, что вам нужно сделать, это добавить маршрут в config / routes.rb. Вы можете просмотреть текущие названия маршрутов с помощью rake routes
. Пример маршрута приведен ниже
# Will create query_path mapping to home.query action
match 'home/query' => 'home#query', :as => :query
Редактировать
Вам необходимо определить это явно, потому что в rails3 по умолчанию не используются сопоставления с подстановочными знаками «[контроллер] / [действие]». Не рекомендуется для контроллеров RESTful. Если вы хотите снова включить эту функциональность, есть пример, который вы можете раскомментировать в routes.rb, но это не рекомендуется.
Ответ №2:
Во-первых, вам, вероятно, понадобится post вместо get . Форма была бы похожа :
<%= form_tag query_path do %>
... (your form elements here)
<%= submit_tag "Submit" %>
<% end %>
Указанный вами query_path является именованным маршрутом. В вашем случае вам понадобился бы подобный файл в ваших routes.rb :
scope :path => '/home', :controller => :home do
post 'query' => :query, :as => 'query'
end
Редактировать :
Если это действительно метод get, просто добавьте:method => «get» в форму и измените маршрут на :
scope :path => '/home', :controller => :home do
get 'query' => :query, :as => 'query'
end
Комментарии:
1. Почему вы предполагаете, что ему нужен запрос post?
2. Мне кажется, более естественным использовать post-запрос, основанный на его вопросе. Однако, если это действительно get , он может просто сохранить метод : как get . Это всего лишь мое предположение, вот почему я думаю, что это вероятно, конечно, не наверняка 🙂 Но позвольте мне отредактировать мой пост, чтобы лучше проиллюстрировать.