我有一些邏輯在我的模型中編碼以計算用戶輸入的兩個日期之間的工作日數。在視圖(javascript)和模型中重用邏輯
在我看來,我想在用戶提交動作之前顯示相同數量的工作日...
有沒有辦法做到這一點,而無需重複代碼?
我寧願避免一個AJAX請求(因爲它似乎有點矯枉過正)。
對您有幫助 p。
我有一些邏輯在我的模型中編碼以計算用戶輸入的兩個日期之間的工作日數。在視圖(javascript)和模型中重用邏輯
在我看來,我想在用戶提交動作之前顯示相同數量的工作日...
有沒有辦法做到這一點,而無需重複代碼?
我寧願避免一個AJAX請求(因爲它似乎有點矯枉過正)。
對您有幫助 p。
我不覺得值得在這裏重複代碼 - 你正在用兩種不同的語言來實現它。我在使用我的Rails應用程序的Web服務的.Net客戶端中做了類似的事情。當然,我還沒有看到你的營業日代碼...
其次,在Rails中做AJAX很容易,所以我不認爲這是過度殺傷。
<%= observe_form 'form-id',
:url => { :action => 'business_days' },
:update => 'business-days'
%>
既然你想避免服務器旅程,你可以把這個邏輯(做計算)在客戶端放入一個javascript中,並在接受用戶的輸入後調用它。
如果你想在前端計算它,你必須創建一個分離的函數(或者做一個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%>;
}
保持兩個實現在一起。
class BusinessDaysCalculator < MultiTierLogic
def ruby
#whatever
end
def js
"/*whatever*/"
end
end
這是一個很好的問題,因爲用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引擎:http://code.google.com/p/v8/在您的服務器上運行JavaScript解釋器,它們都非常有效。
最後,您可以使用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/,它完全防止了這個問題。有時解決問題的辦法是解決問題。
謝謝。似乎是最好的解決方案畢竟:) – Pierre 2009-12-17 06:01:10
我真的不理解負面投票 - 客戶端反饋是可用性的關鍵。這通常需要在多個地方實施邏輯......客戶端層的反饋,中間層的驗證以及數據層的約束。 – MattMcKnight 2009-12-17 16:01:16