2012-04-19 49 views
0

正如大家都知道Rails框架建議通過所謂的UJS嚴格分離JavaScript和Html,但有時我發現自己需要在我的Views中包含JavaScript的即興片段。 首先,我想知道這是否正確?還是皺起了眉頭?使用Rails 3.2,應該避免在視圖中包含條件JavaScript?

中,我覺得自己這樣做的最常見的情況是,當例如我有一個條件塊像這樣的:

= form_for @place do |f| 
    %h5 Address: 
    .input-prepend 
    %span{ :class => "add-on" } 
     %i{ :class => "icon-road" } 
    = f.text_field :address 

    %h5 Name: 
    .input-prepend 
    %span{ :class => "add-on" } 
     %i{ :class => "icon-pencil" } 
    = f.text_field :name 

    = f.hidden_field :latitude 
    = f.hidden_field :longitude 

    #post-button 
    %button{ :class => "btn btn-primary", :type => "submit" } Post it! 

- unless logged_in? 
    :javascript 
    $('#post-button > button, .input-prepend input').addClass('disabled'); 
    $('.input-prepend input').addClass('disabled'); 
    $('.input-prepend input').attr('disabled', 'disabled'); 
    new PopOver().setPopOver($('#post-button > button'), "You must be logged in to register your Business"); 

看看嵌套的,除非條件中的代碼,我想知道是否它是好的有它,或者應該以某種方式生成控制器的那部分代碼?(並將它傳遞給視圖:在這種情況下,我不知道該怎麼做...)

請讓我知道你的想法,我需要知道最有經驗的Rails開發人員會處理這種類型的情況,所以,如果你是一個我想讀你的答案。

在此先感謝!

PS。哦,請讓我看看代碼選項,如果可能的話,你將如何解決這個問題,再次感謝!

回答

1

UJS肯定是在目前的Rails世界上最流行的方法,但不同的開發商把它帶到不同的極端。我認識的一些開發人員完全避開它,因爲根據他們你不知道當你正在查看html時是否會通過JS來處理某個特定元素(我個人認爲這很好,因爲HTML只是關於結構,而不是功能)。

根據你的具體問題,很明顯,你不能簡單地把JavaScript放到一個正常的JavaScript文件夾中加載頁面,因爲JavaScript不會知道你是否登錄。你可以把一個DOM中的某個指示符指示您已登錄,但對我來說這太容易惡搞。決定是否基於服務器上的數據運行JavaScript的一個相當安全的方式是讓一個AJAX調用服務器,如下所示:

  1. 的JavaScript瀏覽器加載使得獲得AJAX調用服務器(使用$ .getScript()with jQuery)
  2. 您的Rails控制器中的動作以.js.erb模板響應AJAX調用
  3. 您可以將盡可能多的服務器端邏輯放入您的.js.erb模板(即只有在用戶未登錄時才運行javascript)

Thi您可以將JavaScript(功能)從您的html(結構)中移出,同時仍然可以做出服務器端的決定。有一個在railscast類似的情景爲dynamic page caching

例如,如果在你的application.js你有:

$.getScript('/users/show') 

那麼這將打電話給你UsersController#show行動。 Rails會尋找app/views/users/show.js.erb模板。在這個文件中你可能有以下幾種:

<% unless logged_in? %> 
    $('#post-button > button, .input-prepend input').addClass('disabled'); 
    $('.input-prepend input').addClass('disabled'); 
    $('.input-prepend input').attr('disabled', 'disabled'); 
    new PopOver().setPopOver($('#post-button > button'), "You must be logged in to register your Business"); 
<% end %> 

當瀏覽器收到服務器的響應後,javascript會自動運行。在這種情況下,如果用戶沒有登錄,它將只運行javascript。

+0

有趣,但讓我們看看我是否得到了這個權利...你是說 裏面:JavaScript我讓$ .get Ajax調用?並根據響應我渲染一個部分? 感謝您的回覆。 – jlstr 2012-05-25 15:40:14

+0

我會親自爲您的頁面創建一個JavaScript文件(如果您正在使用資產管道,則在'assets/javascripts'中)您將進行$ getScript()調用。只要您訪問該頁面,該文件就會運行。從那裏,你可以a)讓控制器根據特定條件選擇要渲染的.js.erb文件,或者b)有一個類似於上面的文件的.js.erb文件,其中運行的JavaScript會有所不同取決於實例變量,控制器變量等。後者更直接,在我看來。 這會讓js完全脫離你的HAML。 – Justin 2012-05-25 16:41:16

+0

這聽起來很合理,但我想很難將你正在談論的情況(在這種情況下是否已登錄或未登錄)傳遞給javascript,對不對?如果可能的話,我希望看到一些代碼片段。 再次感謝賈斯汀。 – jlstr 2012-05-25 17:27:13

相關問題