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_type
的color
領域。
<% 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
。任何更好的想法?
我喜歡它。這工作完美。 (在Rails中渲染有點尷尬,但可以很容易地提取到幫手中,並且它提供了很好的關注分離。) – 2010-04-19 22:01:07