1

ruby on rails controller(.rb) で呼び出したい (使用したい) Javascript で書かれた関数があります。この関数は、optgroup を使用して select を動的に作成および設定します。

これを Ruby コードに変換するにはどうすればよいでしょうか。私の問題は、次のようなものの代わりを見つけることでしたdocument.createElement("optgroup");

JavaScriptコードは次のとおりです。

enter function nbFct() {
var clipLists = ["Default", "Recent", "Sticky lists"];
var option1 = ["a", "b"];
var option2 = ["a", "x", "c"];
var option3 = ["f", "e", "c", "d"];
var listType = [];
var optionType = [];
for (var i = 0; i < clipLists.length; i++) {
// create dynamic optgroup from clipLists
listType[i] = document.createElement("optgroup");
listType[i].label = clipLists[i];   
//  alert(listType[i].label) ;
if(listType[i].label ==  "Default"){
    for (var j = 0; j < option3.length; j++) {
// create options and attach to optgroups
    optionType[j] = document.createElement("option");
    optionType[j].value = option3[j];
//      alert(optionType[j].value) ;
    optionType[j].appendChild(document.createTextNode(option3[j]));
    listType[i].appendChild(optionType[j]); 
    }
}
else if(listType[i].label ==  "Recent"){
    for (var j = 0; j < option2.length; j++) {
// create options and attach to optgroups
    optionType[j] = document.createElement("option");
    optionType[j].value = option2[j];
//      alert(optionType[j].value) ;
    optionType[j].appendChild(document.createTextNode(option2[j]));
    listType[i].appendChild(optionType[j]); 
    }
   }
   else{
      for (var j = 0; j < option1.length; j++) {
  // create options and attach to optgroups
        optionType[j] = document.createElement("option");
        optionType[j].value = option1[j];
  //            alert(optionType[j].value) ;
        optionType[j].appendChild(document.createTextNode(option1[j]));
        listType[i].appendChild(optionType[j]); 
      }
    }
  }
 // set the default
 optionType[1].selected = true;
 // clear select menu and append optgroups
 var selectMenu = document.getElementById("clipListOption");
while (selectMenu.hasChildNodes()) {
selectMenu.removeChild(selectMenu.firstChild);
}
 for (var i = 0; i < clipLists.length; i++) {
    if (listType[i].hasChildNodes()) { selectMenu.appendChild(listType[i]); }
  }
} 
4

1 に答える 1

0

例外的に拷問されたハッキン​​グを除いて、それを簡単に行うことはできません. Rails では、コントローラーはビュー内を見ることができません。できたとしても、そこから Javascript を抽出して、それを独自のローカル バインディング コンテキストで実行することはできません。たとえそれができたとしても、それはMVCパターンのひどい違反であるため、とにかくしたくないでしょう。

絶対にこれを行いたい場合は、おそらく次の組み合わせが必要になります。

  • クライアントから、JS 関数を構成する文字列を POST します。

  • JS を評価して解析します。

  • JS を Ruby 文字列に変換します。

  • コントローラのローカル コンテキストで Ruby 文字列を評価します。

それは大変な作業です。代わりに、モデルはここで重労働を行い、コントローラーに指示を与えることに依存し、その出力がビューに渡される必要があります。

于 2011-12-09T20:05:59.460 に答える