web-dev-qa-db-ja.com

Ruby HAML内のJavaScript内のメソッド

フォームに新しいフィールドを追加するjQueryスクリプトがあり、このフィールドには配列からの動的な情報が含まれています。問題は、HAMLのインデントを壊してエラーを発生させることなく、javascript内の選択フィールドのオプションを設定するarray.eachを追加する方法がわからないことです。

うまくいかない私の最善の試みは次のとおりです:

%script(type="text/javascript")  
  $('#mylink').click(function() {  
  $('#mylink').after('<select>  
  - myarray.each do |options|  
     <option value="#{options.id}">#{options.name}</option>  
  </select>);  
  )};

また、:javascriptフィルターを試してみましたが、うまくいきませんでした。

57
Josh

通常、何かがhamlの痛みである場合は、トリッキーなビットをヘルパーまたはパーシャルにリファクタリングし、それを呼び出す必要があることを意味します。

// some_helper.rb
def new_snazzy_select_tag(options = [])
  select_tag 'tag_name_here', options.map { |option| [option.id, option.name] }
end

また、:javascriptフィルターを使用してjavascriptをレンダリングする必要があります。これは、JavaScriptをスクリプトタグに入れてインデントを許可するためです。

最後に、#{Ruby_expression}フィルターを含むhamlの任意の場所で:javascriptを使用できます。これは、Ruby式の結果をhtml要素のコンテンツ。

// some_view.html.haml
:javascript
  $('#mylink').click(function() {  
    $('#mylink').after("#{escape_javascript new_snazzy_select_tag(myarray)}");
  };
102
Alex Wayne

これを試してください、それは動作するはずです(私がやったのは、5行目の単一のスペースを削除し、6行目に閉じ引用符を追加するだけでした):

%script(type="text/javascript")
  $('#mylink').click(function() {
  $('#mylink').after('<select>
  - @myarray.each do |options|
    <option value="#{options.id}">#{options.name}</option>
  </select>');
  )};

ただし、これをRubyスクリプトまたはフレームワークの種類で実行していると仮定して、テンプレートの外で実行しないのはなぜですか?それがおそらく最も適切です。Rails/ sinatraおよび他のフレームワークでは、これを行うにはヘルパーメソッドを使用できます。hamlリファレンスを見ると、実際に- Rubyを評価します。

8
ehsanul