在视图(javascript)和模型中重用逻辑

时间:2009-12-16 12:48:45

标签: javascript ruby-on-rails

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

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

求助 第

5 个答案:

答案 0 :(得分:2)

这是一个非常好的问题,因为用两种不同的语言重写代码并不是很难干预。

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

在客户端,您无法选择语言并且必须使用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/

另一种选择是使用SpiderMonkey引擎http://www.mozilla.org/js/spidermonkey/或v8引擎在您的服务器上运行JavaScript解释器: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/。有时问题的解决方案是解决问题。

答案 1 :(得分:1)

由于您希望避免服务器脱扣,您可以在javascript中将该逻辑(用于计算)放在客户端,并在从用户那里获取输入后调用它。

答案 2 :(得分:1)

将两个实现保持在一起。

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

答案 3 :(得分:0)

如果要在前端计算它,则必须创建一个单独的函数(或执行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%>;
}

答案 4 :(得分:-1)

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

其次,在Rails中执行AJAX非常容易,所以我不认为这有点过分。

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