如何从JavaScript将参数传递给控制器​​ruby方法

时间:2018-08-17 13:22:17

标签: ruby-on-rails

我的视图中有一个类似这样的选择列表

<select class="sel_list_size" id="product", onchange="build_url('dynamic_div')">
    <%= options_for_select(get_product) %>
</select>

我有一个控制器方法,它将根据所选值运行命令。

def get_inner_dir_of_products(product)
    cmd = `curl #{@base_url[0]}/#{product}/`
    result = JSON.parse(cmd)
    @inner_dirs = []
    result.each_with_index do |element, _index|
        @inner_dirs.append([element['name'], _index + 1])
    end
    @inner_dirs
end

我有一个JavaScript可以调用该方法。

function build_url(div_var) {
    var selected_index = product.selectedIndex;
    var selected_value = product.options[product.selectedIndex].text;
    var selSpan = document.createElement('span');
    $.ajax({
      url: '/get_inner_dir_of_products',
      type: 'GET',
      data: { selected_value }
    })
    // code to build a select list goes here
}

我知道这个ajax调用将无法工作。如何从视图中调用控制器方法?

1 个答案:

答案 0 :(得分:0)

在您的routes.db文件中,您需要将要从javascript访问的路径连接到控制器方法:

get '/get_inner_dir_of_products' => 'youramazingcontroller#get_inner_dir_of_products'

现在,当您在/get_inner_dir_of_products处对服务器进行调用时,Rails知道会将其发送到控制器的get_inner_dir_of_products方法。

get_inner_dir_of_products方法可以使用params对象访问传递给该方法的参数。

@some_value = params[:somevalue]

您可以在javascript中设置参数的名称:

$.ajax({
  url: '/get_inner_dir_of_products',
  type: 'GET',
  data: { somevalue: selected_value }, 
  // etc.
})