Справка по варианту использования простой формы Rails

#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 . Это всего лишь мое предположение, вот почему я думаю, что это вероятно, конечно, не наверняка 🙂 Но позвольте мне отредактировать мой пост, чтобы лучше проиллюстрировать.