Ruby on Rails: выпадающее меню

Я пытаюсь создать раскрывающееся меню, чтобы пользователь мог изменить поле ввода в моей таблице. Пользователь имеет один из трех вариантов: горячий, средний и холодный.

У меня уже есть text_fields, которые по сути делают то же самое для других полей, что все обновляется, когда пользователь нажимает на submit_tag.

Есть ли простой способ реализовать раскрывающийся список и сохранить результат с помощью submit_tag?

спасибо,

-Крис

6 ответов

Вот основной ответ. Массив из двух массивов элементов является важной частью.

<% form_for @entry do |f| %>
 <%= f.text_field :name %>
 <%= f.select :temperature, [['Hot','hot'],['Medium','medium'],['Cold','cold']] %>
 <%= f.submit %>
<% end %>


Я возьму 2 вещи:

  • Что вы - идиома <%= form_for @model_instance (объяснено в разделе 2.2 это руководство).
  • Чтобы вы сохраняли "горячие", "средние" и "холодные" значения как строки (а не цифры 1,2 и 3 или что-то подобное) в вашей базе данных.

Скажем, что у вас есть два поля, называемые :name и :temperature, управляемые двумя text_fields:

<% form_for @article do |f| %>
            <%= f.text_field :name %>
            <%= f.text_field :temperature %>
            <%= f.submit "Create" %>
            <% end %>
            <% end %>

Теперь вы хотите изменить: управление температурой в раскрывающемся списке, принимая значения "горячая", "средняя" и "холодная" как значения. Тогда вы можете сделать это следующим образом:

<% form_for @article do |f| %>
 <%= f.text_field :name %>
 <%= f.collection_select :temperature, Article::TEMPERATURES, :to_s, :to_s, 
 :include_blank => true
 %>
 <%= f.submit "Create" %> <% end %>
<% end %>

Теперь вам нужно определить константу Article::TEMPERATURES в своей модели статьи. Это не должно быть очень сложно:

class Article < Activerecord::Base
 TEMPERATURES = ['hot', 'medium', 'cold']

Возможно, вам интересно, почему я добавил часть :include_blank в collection_select. Это добавит "пустой" вариант в раскрывающемся списке. Вам понадобится эта пустая опция при создании новых объектов, если вы не хотите, чтобы значение по умолчанию было задано.


Я работал над чем-то подобным. Я получил это для работы, просто добавив либо перечисление, либо константу (аналогично тому, что сказал kikito ранее) в моей модели, а затем вызвал выбор в моей форме.

Вот как он может работать.

с использованием константы:

class ClassName < ActiveRecord:: Base ТЕМПЕРАТУРЫ=['Горячие', 'Средний' , 'Холодный' ] конец

bin/rails g migration add_column_to_table температуры: строка

_form.html.erb

<%= f.label :temperature %>
<%= f.select :temperature, ClassName::TEMPERATURE %>

или

с использованием перечисления:

class ClassName < ActiveRecord:: Base температура перелива: [: горячая,: средняя,: холодная] конец

bin/rails g migration add_column_to_table температуры: integer

_form.html.erb

<%= f.label :temperature %>
<%= f.select :temperature, ClassName.temperatures.keys %>

Надеюсь, что вам поможет!


Возможно, вы захотите рассмотреть formtastic gem, который намного меньше кода.

<% semantic_form_for @stuff do |f| %> 
 <% f.inputs do %> 
 <%= f.input :name %> 
 <%= f.input :temperature, :as => :select, 
 :label => "Degree", :include_blank => false,
 :collection => [["Hot", 1], ["Medium", 2], ["Cold", 3]] %> 
 <% end %> 
 <%= f.buttons %> 
<% end %>


В соответствии со всеми приведенными выше ответами не забудьте сделать этот последний важный шаг:

Перезагрузите сервер!

Как новичок, мне было интересно, почему мой массив не работал, хотя я правильно выполнил все шаги.

licensed under cc by-sa 3.0 with attribution.