【发布时间】:2009-12-16 12:48:44
【问题描述】:
我在我的模型中编写了一些逻辑代码来计算用户输入的两个日期之间的工作日数。
在我看来,我希望在用户提交操作之前显示相同数量的工作日...
有没有办法在不重复代码的情况下做到这一点?
我宁愿避免 AJAX 请求(因为这似乎有点矫枉过正)。
为了您的帮助 p.
【问题讨论】:
我在我的模型中编写了一些逻辑代码来计算用户输入的两个日期之间的工作日数。
在我看来,我希望在用户提交操作之前显示相同数量的工作日...
有没有办法在不重复代码的情况下做到这一点?
我宁愿避免 AJAX 请求(因为这似乎有点矫枉过正)。
为了您的帮助 p.
【问题讨论】:
这是一个很好的问题,因为用两种不同的语言重写代码至少可以说不是很干。
这个问题经常发生,特别是对于应该在客户端完成以提供即时反馈并且出于安全目的必须在服务器上完成的验证。
在客户端,您无法选择语言,必须使用 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/ 完全防止了这个问题。有时解决问题的方法是消除问题。
【讨论】:
由于您想避免服务器跳闸,您可以将该逻辑(进行计算)放在客户端的 javascript 中,并在获取用户输入后调用它。
【讨论】:
将两个实现放在一起。
class BusinessDaysCalculator < MultiTierLogic
def ruby
#whatever
end
def js
"/*whatever*/"
end
end
【讨论】:
MultiTierLogic 类。
如果您想在前端计算它,您必须创建一个单独的函数(或进行 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%>;
}
【讨论】:
我认为不值得在这里复制代码 - 您正在用两种不同的语言实现它。我在使用我的 Rails 应用程序的 web 服务的 .Net 客户端中做了类似的事情。当然,我还没有看到你的工作日代码...
其次,在 Rails 中执行 AJAX 非常容易,所以我不认为这是矫枉过正。
<%= observe_form 'form-id',
:url => { :action => 'business_days' },
:update => 'business-days'
%>
【讨论】: