我正在建立一个基本上是一个小型内容管理系统的网站。 (从某种意义上说,用户将能够动态地更改网站的大部分内容)
在我的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“位置。
所以,我需要找到一种方法来更新该字段以显示该类别中的可用位置,但我不知道该怎么做。任何帮助将不胜感激。
答案 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%>