如何根据选择动态改变表单的位置

时间:2012-02-11 06:12:43

标签: jquery ruby-on-rails ajax forms railscasts

我正在建立一个基本上是一个小型内容管理系统的网站。 (从某种意义上说,用户将能够动态地更改网站的大部分内容)

在我的rails应用程序中,我有两个模型,分类和子类别。类别具有许多子类别,子类别属于类别。

每个子类别都有一个位置字段,用于指示在类别下显示的位置。

按表单创建子类别时,我希望用户可以选择从数据库中所有类别的列表中选择类别(我工作正常)。然后,我希望位置字段(下拉框)根据该类别中当前可用的位置进行更新。

我目前在应用程序控制器中跟踪子类别的可用位置的想法是:

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

然后我向@count添加+1,因此它为我提供了可用的位置+1。 (如果有人有更好的方法,请告诉我。)

我目前正在关注Ryan Bates的railscast 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 个答案:

答案 0 :(得分:1)

您的问题有不同的解决方案。

如果继续使用您的无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%>