2010-04-19 60 views
3

我有一个Widget模型与继承(我使用单表继承,但它同样有效的类每表)。一些子类需要特定的字段;别人不会。如何在服务器端Ruby和客户端Javascript之间干掉业务逻辑?

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),并想以动态显示/隐藏根据<select>widget_typecolor领域。

<% 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事件的widget_type,但是这将意味着将某种WidgetTypesThatRequireColor不断的在我的JavaScript。很容易手动完成,但很可能会从Widget模型类中断开连接。

我不想直接在我的视图中输出Javascript,尽管我已经考虑在我的模板页脚中使用content_for(:js)并且有一个yield :js。任何更好的想法?

回答

3

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

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

然后让jQ观看选择并根据所选选项的类别显示或隐藏div。

+0

我喜欢它。这工作完美。 (在Rails中渲染有点尴尬,但可以很容易地提取到帮手中,并且它提供了很好的关注分离。) – 2010-04-19 22:01:07