2010-04-19 66 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

相關問題