在 ERB 中将 JavaScript 值传递给 Ruby

Passing JavaScript value to Ruby in ERB

我想将 JavaScript 值作为参数传递给 ERB 中的 Ruby 函数。

index.html.erb

代码
function ABC(){
  variable = document.getElementById('textfield').value;
}

function XYZ(){
  <%= ruby_function(variable) %>
}

我需要帮助才能实现这一目标。

实现此目的的适当方法是在脚本中使用 ajax。

例如,您可以使用咖啡脚本并执行类似的操作。

ABC = ->
  variable = document.getElementById('textfield').value
  res = $.ajax(
    url: '#{method_controller_path}'
    method: 'GET'
    data:
      param: variable
    dataType: 'json'
    success: (res) ->
      res
  )

最后您将得到 res 对象。

如果您不使用咖啡或外部脚本文件。您可以使用 index.html.erb 文件中的 javascript 来执行此操作。

这是一个例子。

const ABC = function() {
  let res;
  const variable = document.getElementById('textfield').value;
  return res = $.ajax({
    url: '#{method_controller_path}',
    method: 'GET',
    data: {
      param: variable
    },
    dataType: 'json',
    success(res) {
      return res;
    }
  });
};

希望这对您有所帮助。 :)

这个灵魂在没有 Jquery 的情况下工作。

ruby 控制器:

class MyServiceController
  def variable
    @var = ruby_function(params[:js_var])
    responde_to do |format|
      format.js { render json: @var }
    end
  end
end 

js函数:

  function XYZ(){
    var variable = document.getElementById('textfield').value;
    var xhr = new XMLHttpRequest();
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xhr.open('POST', 'myservice/variable');
    xhr.onload = function() {
      var rubyResponse = xhr.responseText;
    };
    xhr.send(encodeURI('js_var=' + variable));
  }

你可以使用 ERB(embedded ruby) 如果你把它写在 html 的脚本标签里并且文件是一个 ERB 文件。此 javascript 中的 ruby 代码示例是良性的,但说明了如何执行此操作。

<body>
  <%= render 'shared/overlay' %>
  <%= render 'shared/notice_alert_modals' %>
  <header>
    <%= image_tag header_logo, class: 'logo' %>
  </header>
  <div class="content">
    <%= yield %>
  </div>
  <script>
    $(document).ready(function(){
      // append some tag with erb ruby
      var html = "<h2>ABC<%= %w[D E F].split(' ').join %></h2>"
      $('body').append(html)
    })
  </script>
</body>