代码之家  ›  专栏  ›  技术社区  ›  James A. Rosen

如何在服务器端ruby和客户端javascript之间耗尽业务逻辑?

  •  3
  • James A. Rosen  · 技术社区  · 15 年前

    我有一个 Widget 带继承的模型(我使用单表继承,但对于每个表的类来说同样有效)。一些子类需要一个特定的字段;其他的则不需要。

    class Widget < ActiveRecord
      ALL_WIDGET_TYPES = [FooWidget, BarWidget, BazWidget]
    end
    
    class FooWidget < Widget
      validates_presence_of :color
    end
    
    class BarWidget < Widget
      # no color field
    end
    
    class BazWidget < Widget
      validates_presence_of :color
    end
    

    我正在创建一个“新窗口小部件”表单( app/views/widgets/new.html.erb )并希望动态显示/隐藏 color 基于 <select> 对于 widget_type .

    <% form_for @widget do |f| %>
      <%= f.select :type, Widget::ALL_WIDGET_TYPES %>
      <div class='hiddenUnlessWidgetTypeIsFooOrBaz'>
        <%= f.label :color %>
        <%= f.text_field :color %>
      </div>
    <% end %>
    

    我可以很容易地编写一些jquery来监视 onChange 事件对 WigGeType类型 ,但这意味着 WidgetTypesThatRequireColor 在我的javascript中保持不变。很容易手动操作,但很可能会与 小装置 模型类。

    我不希望直接在视图中输出javascript,尽管我已经考虑过使用 content_for(:js) 并且有一个 yield :js 在我的模板页脚。有更好的主意吗?

    1 回复  |  直到 13 年前
        1
  •  3
  •   Matt Ball    13 年前

    这是我要生成的html。您可以通过各种方式从视图或助手生成它。

    <select ...>
        <option class="widget colored">FooWidget</option>
        <option class="widget uncolored">BarWidget</option>
        <option class="widget colored">BazWidget</option>
    </select>
    

    然后让jq根据所选选项的类来观察select和show或hide div。