微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何干燥服务器端Ruby和客户端Javascript之间的业务逻辑?

我有一个带有继承的Widget模型(我使用的是Single-Table Inheritance,但它对于每个表的类同样有效).一些子类需要特定的字段.别人没有.

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.

<% 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来监视widget_type上的onChange事件,但这意味着将某种WidgetTypesthatRequireColor常量放入我的Javascript中.足够容易手动完成,但是很可能会与Widget模型类断开连接.

尽管我考虑过使用content_for(:js)并在模板页脚中使用yield:js,但我不希望在视图中直接输出Javascript.还有更好的主意吗?

解决方法:

这是我将生成的html.您可以通过各种方式从视图或帮助器生成它.

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐