【问题标题】:How do I DRY up business logic between sever-side Ruby and client-side Javascript?如何干掉服务器端 Ruby 和客户端 Javascript 之间的业务逻辑?
【发布时间】:2010-04-19 16:47:48
【问题描述】:

我有一个带有继承的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),并希望根据 &lt;select&gt;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 来监视 widget_type 上的 onChange 事件,但这意味着在我的 Javascript 中放置某种 WidgetTypesThatRequireColor 常量。手动操作很容易,但它可能会与 Widget 模型类断开连接。

虽然我考虑过使用content_for(:js) 并在模板页脚中有yield :js,但我不希望直接在我的视图中输出Javascript。有更好的想法吗?

【问题讨论】:

    标签: javascript jquery ruby-on-rails ruby dry


    【解决方案1】:

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

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

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

    【讨论】:

    • 我喜欢它。这完美地工作。 (在 Rails 中渲染有点尴尬,但可以很容易地提取到帮助程序中,并且提供了很好的关注点分离。)
    猜你喜欢
    • 2012-07-22
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 2016-03-18
    相关资源
    最近更新 更多