Как динамически изменить положение формы на основе выбора - PullRequest
0 голосов
/ 11 февраля 2012

Я создаю веб-сайт, который представляет собой небольшую систему управления контентом. (в том смысле, что пользователь сможет динамически изменять большую часть контента сайта)

В моем приложении rails у меня есть две модели: категория и подкатегория. Категория имеет много подкатегорий, и подкатегория принадлежит категории.

Каждая подкатегория имеет поле позиции, которое определяет, где оно отображается под категорией.

При создании подкатегории по форме я хочу, чтобы у пользователя была возможность выбрать категорию из списка всех категорий в базе данных (что у меня нормально работает). Затем я хочу обновить поле позиции (раскрывающийся список) в зависимости от того, какие позиции в настоящее время доступны в этой категории.

Моя текущая идея отслеживать доступную позицию для подкатегории в моем контроллере приложений:

def subcategory_count(subcategory)
category = subcategory.category
@count = category.subcategories.count
end 

Затем я добавляю +1 к @count, чтобы получить доступные позиции +1. (Если у кого-то есть лучший способ сделать это, пожалуйста, дайте мне знать.)

В настоящее время я слежу за пересмотренными рейкастами Райана Бейтса 88, которые являются динамическим выбором меню. Вот как выглядит моя форма прямо сейчас.

<%= form_for(@subcategory) do |f| %>
<p>
<%= f.label(:name) %>
<%= f.text_field :name %>
</p>
<p>

<%= f.label(:category_id) %>  
<%= f.collection_select :category_id, Category.order(:position), :id, :name,     include_blank: true %>

</p>

<p>
<%= f.label :position, "Position" %>
<%= f.grouped_collection_select :position, Category.order(:position), :subcategories,  :name, :position, :position%>
</p>
<p>


<%= f.submit("Submit") %>
</p>
<% end %>

Проблема с этим кодом заключается в том, что мне нужно, чтобы он отображался как int, чтобы я мог добавить +1 к нему, в противном случае, когда в базе данных нет подкатегорий, он просто отображается пустым и не позволяет мне выбрать " 1 "позиция.

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

1 Ответ

1 голос
/ 11 февраля 2012

Существуют различные решения вашей проблемы.

Если вы продолжите использовать решение без AJAX, попробуйте переопределить или просто создать другой метод для Category, чтобы вернуть существующие подкатегории плюс одну новую (только для заглушки)):

class Category
has_many :subcategories

def subcategories_with_placeholder
  result = [Subcategory.new :position => (subcategories.length + 1)]
  subcategories.each{|s| result << s}
  result
end
#other class code
end

и заменить

<%= f.grouped_collection_select :position, 
  Category.order(:position), 
  :subcategories,
  :name, 
  :position, 
  :position%>

на:

<%= f.grouped_collection_select :position, 
  Category.order(:position), 
  :subcategories_with_placeholder,  
  :name, 
  :position, 
  :position%>
...