【问题标题】:reuse logic in views (javascript) and model在视图(javascript)和模型中重用逻辑
【发布时间】:2009-12-16 12:48:44
【问题描述】:

我在我的模型中编写了一些逻辑代码来计算用户输入的两个日期之间的工作日数。

在我看来,我希望在用户提交操作之前显示相同数量的工作日...
有没有办法在不重复代码的情况下做到这一点?
我宁愿避免 AJAX 请求(因为这似乎有点矫枉过正)。

为了您的帮助 p.

【问题讨论】:

    标签: javascript ruby-on-rails


    【解决方案1】:

    这是一个很好的问题,因为用两种不同的语言重写代码至少可以说不是很干。

    这个问题经常发生,特别是对于应该在客户端完成以提供即时反馈并且出于安全目的必须在服务器上完成的验证。

    在客户端,您无法选择语言,必须使用 JavaScript。这意味着如果你想重用你的代码,你必须至少有一个 JavaScript 版本。

    一种选择是使用 HotRuby http://hotruby.yukoba.jp/ 直接在客户端运行 Ruby 的(大)子集。有趣的是,这非常有效:http://ejohn.org/blog/ruby-vm-in-javascript/,因此应该满足您的需求。同样,RubyJS http://www.ntecs.de/projects.html 将 Ruby 代码转换为 JavaScript。另一个是 rb2js http://rb2js.rubyforge.org/

    另一种选择是在您的服务器上运行 JavaScript 解释器,使用 SpiderMonkey 引擎http://www.mozilla.org/js/spidermonkey/ 或 v8 引擎:http://code.google.com/p/v8/,两者都非常高效。

    最后,您可以使用 RKelly 将 JavaScript 转换为 Ruby:http://tenderlovemaking.com/2007/04/15/converting-javascript-to-ruby-with-rkelly/

    我相信第一个选项更容易实现,并且会取悦大多数 Rails 程序员,因为他们只编写 Ruby 代码。第二种选择在客户端上可能更有效,但以服务器上的其他低效率为代价。第三种选择可能是最有效的,并且会更吸引 JavaScript 程序员或重用现有的 JavaScript 代码。

    虽然这超出了最初的问题(关于 Rails),但我还想指出 JavaScript MVC http://javascriptmvc.com/ 完全防止了这个问题。有时解决问题的方法是消除问题。

    【讨论】:

      【解决方案2】:

      由于您想避免服务器跳闸,您可以将该逻辑(进行计算)放在客户端的 javascript 中,并在获取用户输入后调用它。

      【讨论】:

      • 我不会将后端代码移到前端,有太多方法可以绕过它。例如,如果用户停用了 JS,则持续时间将被错误计算
      • JS 在任何现代浏览器中被停用的可能性都非常小。大多数应用程序的很多工作都依赖于 JS。虽然我同意你的观点,将业务逻辑从模型转移到 Js 不是最好的主意,但由于在这种情况下计算逻辑并不重要,它不会受到伤害。
      • 实际上,计算在模型中至关重要……这就是为什么我无论如何都希望在模型中使用它。
      【解决方案3】:

      将两个实现放在一起。

      class BusinessDaysCalculator < MultiTierLogic
        def ruby
          #whatever
        end
        def js
          "/*whatever*/"
        end
      end
      

      【讨论】:

      • 哇。这看起来不错,但我不确定如何使用它......并且谷歌搜索“MultiTierLogic rails”并不是很鼓舞人心:)
      • 我虚构了一个MultiTierLogic 类。
      • 我从来没有想到过这种方法。我……我喜欢。
      【解决方案4】:

      如果您想在前端计算它,您必须创建一个单独的函数(或进行 Ajax 调用)。

      但是,您可以在两个函数之间共享一些信息。例如:

      def business_days_whatever
        business_days = ["monday","tuesday"]
        // do stuff
      end
      

      将 business_days 移入常量。

      def business_days_whatever
        business_days = Constants::BUSINESS_DAYS
        // do stuff
      end
      

      然后在javascript中你可以做

      function business_blah(){
        vat days = <%= Constants::BUSINESS_DAYS.to_javascript_array%>;
      }
      

      【讨论】:

        【解决方案5】:

        我认为不值得在这里复制代码 - 您正在用两种不同的语言实现它。我在使用我的 Rails 应用程序的 web 服务的 .Net 客户端中做了类似的事情。当然,我还没有看到你的工作日代码...

        其次,在 Rails 中执行 AJAX 非常容易,所以我不认为这是矫枉过正。

        <%= observe_form 'form-id',
                         :url => { :action => 'business_days' }, 
                         :update => 'business-days' 
        %>
        

        【讨论】:

        • 我真的不明白反对票——客户端反馈是可用性的关键。这通常需要在多个地方实现逻辑……客户端层的反馈、中间层的验证、数据层的约束。
        猜你喜欢
        • 2010-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-02
        • 1970-01-01
        • 2012-03-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多