0

誰もが知っているように、UJS と呼ばれるものを介して JavaScript と Html を厳密に分離するための Rails フレームワークのアドバイスですが、ビューに 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開発者がこの種の状況をどのように処理するかを知る必要があるので、もしあなたが1人なら、あなたの答えを読みたいです.

前もって感謝します!

PS。ああ、可能であれば、これにどのように対処するかについてのコード オプションを見せてください。ありがとうございます。

4

1 に答える 1

1

UJS は確かに現在 Rails の世界で最も人気のあるアプローチですが、さまざまな開発者がさまざまな極端な方法でそれを採用しています。私が知っている一部の開発者は、html を見ているだけでは、特定の要素が JS を介して作用するかどうかわからないため、それを完全に避けています (HTML は単に構造に関するものであり、構造に関するものではないため、個人的には問題ないと思います)。機能)。

特定の問題に関しては、javascriptはログインしているかどうかを認識できないため、javascriptを通常のjavascriptフォルダーに単純に配置してページにロードすることはできないことは明らかです.ログインしていることを示す DOM ですが、私にとっては簡単になりすますことができます。サーバー上のデータに基づいて JavaScript を実行するかどうかを決定するかなり安全な方法の 1 つは、次のようにサーバーに対して AJAX 呼び出しを行うことです。

  1. ブラウザーによって読み込まれた Javascript は、サーバーに対して get AJAX 呼び出しを行います (jQuery で $.getScript() を使用)。
  2. Rails コントローラーのアクションは、.js.erb テンプレートを使用して AJAX 呼び出しに応答します。
  3. .js.erb テンプレートに好きなだけサーバー側のロジックを入れることができます (つまり、ユーザーがログインしていない場合にのみ JavaScript を実行します)。

このようにして、サーバー側の決定を行うことができる一方で、javascript (機能) を html (構造) から除外します。Railscast にも動的ページ キャッシング用の同様のシナリオがあります。

たとえば、application.js に次のようなものがあるとします。

$.getScript('/users/show')

次に、これはあなたのUsersController#showアクションを呼び出します。app/views/users/show.js.erbその後、Rails はテンプレートを探します。このファイルには、次のものを含めることができます。

<% 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 が実行されます。

于 2012-05-25T07:53:25.763 に答える