1

filename次のように、JavaScript 変数を Ruby コードに挿入しようとしています。

"#{ajax_download_report_url(" + filename+ ")}"

これは基本的なルート URL ですが、この Ajax リクエストから取得するため、HAML でこの変数を渡す必要があります。

:javascript
        var updaterId = setInterval(function() {
          $.ajax({
            url: #{admin_reports_url.to_json},
            dataType: "json",
            type:  "GET",
            data: {job_id: "#{job_id}"},
            success: function(response){
              var filename = response.file;
              switch(status) {
                case 'failed':
                  $('.loader').hide();
                  clearInterval(updaterId);
                  alert(message);
                  break;
                case 'completed':
                  $('.loader').hide();
                  clearInterval(updaterId);
                  location.href = "#{ajax_download_report_admin_reports_url(" + filename+ ")}";
                  break;
              }
            }
          })}, 1000);

今、私はエラーがあります:

ActionController::RoutingError - No route matches 
{:controller=>"admin/reports", :action=>"ajax_download_report", :file=>" + filename+ "}

これは、HAML がこのコードを適切に評価できないことを意味します。

4

4 に答える 4

1

これ:

ajax_download_report_admin_reports_url(" + filename+ ")

次のパラメーターを使用して、Ruby でメソッドを呼び出します。

" + filename+ "

そのため、次のように表示されます。

:file=>" + filename+ "

JavaScript はブラウザ内で実行されるクライアント側であり、サーバー上の Ruby コードに触れることができないため、JavaScript 変数は Ruby からは見えず、何らかの方法filenameで値をサーバーに送り返さない限り到達できません。filename


同様の必要性があったときに私が過去に行ったことは、URL を生成して JavaScript 変数定義に格納し、JavaScript 文字列連結を使用して URL を適切な場所に挿入することでした。これが何をするかに注意してください:

File.dirname("http://foo.bar/baz/bor.html")
=> "http://foo.bar/baz"

リソース名を削除し、ベース URL のみを残します。それを使用して:

:javascript
  var admin_reports_base_url = "#{ File.dirname(ajax_download_report_admin_reports_url('foo')) }/"
  var updaterId = setInterval(function() {
    $.ajax({
      url: #{admin_reports_url.to_json},
      dataType: "json",
      type:  "GET",
      data: {job_id: "#{job_id}"},
      success: function(response){
        var filename = response.file;
        switch(status) {
          case 'failed':
            $('.loader').hide();
            clearInterval(updaterId);
            alert(message);
            break;
          case 'completed':
            $('.loader').hide();
            clearInterval(updaterId);
            location.href = admin_reports_base_url + filename;
            break;
        }
      }
    })}, 1000);
于 2013-06-27T06:19:42.647 に答える
0

解決策の 1 つは、Ruby コードを使用しないことです。

例えば:

location.href = "admin/reports/ajax_download_report?file=" + filename;
于 2013-06-27T06:20:06.233 に答える
0
def get_url(x)
   return "a url: #{x}"
end

filename = 'abcd'

puts "#{get_url(filename)}"

--output:--
a url: abcd

しかし、ファイル名と呼ばれる js 変数を使用しようとしています。この変数は、ページがブラウザーに送信されてから、しばらくして ajax 呼び出しが実行されるまで存在しません。現在実行中の ruby​​ コードでは。いいえ、できません。

于 2013-06-27T05:36:11.597 に答える
0
"#{ajax_download_report_admin_reports_url('')}" + filename
于 2013-06-27T06:40:27.580 に答える