Замените form_for предустановленным вводом

У меня есть form_for, в котором есть текстовое поле ввода, введенный текст отправляется контроллеру, который выполняет поиск в таблице из БД.

Но я хотел бы сделать что-то другое, вместо того, чтобы вводить текст в текстовое поле, я хочу создать поисковые запросы по умолчанию. Это будут кнопки с текстом, и на основе этого текста параметр будет отправлен на контроллер и выполнен поиск.

Как я могу это сделать? Я использую Рельсы 4

Моя форма_тег

<%= form_tag pos_project(@project), method: :get do %>
<p>
 <%= text_field_tag :query, params[:query] %>
 <%= submit_tag "Search", name: nil %>
</p>
<% end %>

Чего я хочу достичь:

Кнопка: (текст в кнопке) -> MyButton При нажатии на эту кнопку текст MyButton будет отправлен на контроллер, контроллер примет параметр, запросит таблицу базы данных и отобразит результаты, содержащие текст MyButton, используя ниже запрос.

where("name @@ :q", q: query)


person John    schedule 11.12.2013    source источник


Ответы (2)


Почему бы не использовать HTML и Javascript:

<!-- in your view -->
<%= form_tag pos_project(@project), method: :get, id: "your_search_form" do %>
<p>
 <%= hidden_field_tag :query, params[:query] %>
 <%= submit_tag "Search", name: nil %>
</p>

<% for value in your_preset_values do %>
  <%= link_to(value, '#', data: { search_query_value: value }, class: "search-query-link")
<% end %>

И в вашем файле coffee.js:

# A class for the Search form JS
class SearchForm

  constructor: ->
    # when a search query link is clicked...
    $('a.search-query-link').click (e) ->
      # find the value from the data attribute
      searchQuery = $(this).data('search-query-value')
      # assign the value to the hidden field
      $("input[type='hidden']#query").val(searchQuery)
      # optional - submit the form
      $("#your_search_form")[0].submit()


# Called when the document is loaded    
jQuery ->
  new SearchForm()
person bodacious    schedule 11.12.2013
comment
Спасибо, но это не сработало, и страница не переставала обновляться. В конце концов я сделал следующее: <%= link_to(value.name, '?utf8=✓&query='+value.name)%> Не знаю, хороший ли это подход, но он работает. - person John; 11.12.2013
comment
Он не отправлял никаких параметров на контроллер. - person John; 11.12.2013
comment
На самом деле работает, если я перемещаю jQuery -> new SearchForm() перед классом SearchForm, но он ведет себя так же с решением, которое я разместил выше. Еще раз спасибо. - person John; 11.12.2013
comment
Хорошо - пожалуйста. Вы не должны требовать параметр utf8. '?query='+value.name - person bodacious; 11.12.2013

Вы можете использовать "фиксацию" из параметра, чтобы найти, какая кнопка нажата.

Итак, в контроллере вы получите

params[:commit]="button1" # or
params[:commit]="button2" # or 
params[:commit]="button3" # based on which button you pressed
person jbmyid    schedule 11.12.2013