повторно использовать логику в представлениях (javascript) и модели - PullRequest
1 голос
/ 16 декабря 2009

У меня есть некоторая логика для кодирования в моей модели, чтобы вычислить количество рабочих дней между двумя датами, введенными пользователем.

На мой взгляд, я хотел бы отобразить такое же количество рабочих дней, прежде чем пользователь отправит действие ...
Есть ли способ сделать это без дублирования кода?
Я бы предпочел избегать запроса AJAX (поскольку это кажется немного излишним для этого).

за вашу помощь р.

Ответы [ 5 ]

2 голосов
/ 02 февраля 2010

Что ж, это очень хороший вопрос, потому что переписывание кода на 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/.

Другой вариант - запустить интерпретатор JavaScript на вашем сервере, используя движок SpiderMonkey http://www.mozilla.org/js/spidermonkey/ или механизм v8: http://code.google.com/p/v8/, оба из которых очень эффективны.

Наконец, вы можете конвертировать JavaScript в Ruby, используя RKelly: http://tenderlovemaking.com/2007/04/15/converting-javascript-to-ruby-with-rkelly/.

Я полагаю, что первый вариант проще реализовать и понравится большинству программистов Rails, так как один пишет только код на Ruby. Второй вариант может быть более эффективным на клиенте, но за счет других недостатков на сервере. Третий вариант может быть наиболее эффективным и больше подойдет для программистов JavaScript или для повторного использования существующего кода JavaScript.

Хотя это выходит за рамки первоначального вопроса (который касается Rails), я также хотел бы указать на JavaScript MVC http://javascriptmvc.com/, который полностью предотвращает эту проблему. Иногда решением проблемы является ее устранение.

1 голос
/ 16 декабря 2009

Держите две реализации вместе.

class BusinessDaysCalculator < MultiTierLogic
  def ruby
    #whatever
  end
  def js
    "/*whatever*/"
  end
end
1 голос
/ 16 декабря 2009

Поскольку вы хотите избежать отключения сервера, вы можете поместить эту логику (которая выполняет вычисления) на стороне клиента в JavaScript и вызывать ее после получения ввода от пользователя.

0 голосов
/ 17 декабря 2009

Я не думаю, что здесь стоит дублировать код - вы реализуете его на двух разных языках. Я делаю нечто подобное в клиенте .Net, который использует веб-сервис моего приложения Rails. Конечно, я не видел код твоего рабочего дня ...

Во-вторых, AJAX в Rails смехотворно прост, поэтому я не считаю это излишним.

<%= observe_form 'form-id',
                 :url => { :action => 'business_days' }, 
                 :update => 'business-days' 
%>
0 голосов
/ 16 декабря 2009

Если вы хотите вычислить его во внешнем интерфейсе, вам придется создать отдельную функцию (или выполнить Ajax-вызов).

Однако вы можете поделиться некоторой информацией между вашими двумя функциями. Например:

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

Переместить рабочие дни в константу.

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

Тогда в javascript вы можете сделать

function business_blah(){
  vat days = <%= Constants::BUSINESS_DAYS.to_javascript_array%>;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...