【问题标题】:How to dynamically change position of form based on selection如何根据选择动态更改表单的位置
【发布时间】:2012-02-11 06:12:43
【问题描述】:

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

在我的 rails 应用程序中,我有两个模型,一个类别和一个子类别。一个Category有很多Subcategories,一个Subcategory属于一个Category。

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

当按表单创建子类别时,我希望用户可以选择从数据库中所有类别的列表中选择类别(我工作得很好)。然后,我希望根据该类别中当前可用的职位来更新职位字段(一个下拉框)。

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

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

然后我将 +1 添加到 @count,这样它就会给我可用的职位 +1。 (如果有人有更好的方法,请告诉我。)

我目前正在关注 Ryan Bates 的 railscasts 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" 位置。

所以,我需要找到一种方法来更新该字段以显示该类别中的可用职位,但我不知道该怎么做。任何帮助将不胜感激。

【问题讨论】:

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


    【解决方案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%>
    

    【讨论】:

    • 感谢@Mark 的回答,这是有道理的。我也对 Ajax 解决方案很好奇。我计划使用 ajax 来更新我的表单,但我不知道如何使用它来获得正确的位置值。我试图在我的代码中实现您的修复,现在我收到错误 code undefined method `position' for {:position=>1}:Hash Extracted source (about line #15): 12: 13:

      14: 15: 16:

      17:

      18:

    • 这是我最终放入我的 category.rb 模型def subcategories_with_placeholder result = [Subcategory.new, position: (Subcategory.count + 1)] subcategories.each{|s| result &lt;&lt; s} result end
    • 您的代码似乎有错误:[Subcategory.new, position: (Subcategory.count + 1)] 行打算创建一个数组,其中包含一个子类别实例,该实例的位置为当前Category 的子类别计数的 +1。但是您的代码似乎只是将两项添加到数组中:一个空子类别和第二个 - 哈希,这可能会导致您在第一条评论中提供的错误。
    • 再次感谢,所以我认为我最大的问题是我可能不理解 subcategories_with_placeholder 函数在做什么。当它返回结果时,它究竟返回了什么?在我看来,subcategories.each{|s| result &lt;&lt; s} 行循环遍历每个子类别并将其存储在结果数组中?这如何让我获得我需要的“职位”?再次感谢您的帮助。
    • @ruevaughn,想法是按照您的要求使用默认值填充位置选择。例如,如果 Category 有 0 个子类别,subcategories_with_placeholder 将返回一个数组,其中一个 Subcategory 的位置为 1。在其他情况下,它将返回一个数组,其中包含 Category 的所有子类别加上一个 Subcategory,其作用类似于新的占位符.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 2020-08-22
    相关资源
    最近更新 更多