通过 Ajax 调用将变量传递给控制器

Posted

技术标签:

【中文标题】通过 Ajax 调用将变量传递给控制器【英文标题】:Passing variable to controller through Ajax call 【发布时间】:2020-02-26 19:37:04 【问题描述】:
Rail 5.2
datatables

在我的views/books/index.html.slim 中,我正在从另一个MVC 加载部分内容,如下所示:

 = render  partial: 'authors/index', :locals => :author => @book.author

在我的意见/作者/_index.html 中,我有以下内容:

.....    
table.table-striped.table-bordered.table-hover.nowrap#AuthorsIndex.display
.....

javascript:
  $('#AuthorsIndex').DataTable(
    ajax: '/authors',
    columns: [
      title: 'Publish Date', data: 'created_at',
      title: 'Publisher', data: 'publisher',
      title: 'Title', data: 'title',
    ]
  );

而且,在我的 controllers/authors_controllers.rb 中,我有以下内容:

def index
  @authors = Author.where(author: "John Doe")
  render json:  data: @authors 
end

当我运行它时,作者表正确显示。问题是作者姓名在控制器操作中是硬编码的。我的 _index 部分,正在接收作者姓名,但是作为我正在进行的 Ajax 调用的一部分,我如何将其发送给作者控制器? Ajax/Javascript 新手。

【问题讨论】:

【参考方案1】:

怎么样

#_index.html
javascript:
  $('#AuthorsIndex').DataTable(
    ajax: '/authors?author=<%= author %>',
    columns: [
      title: 'Publish Date', data: 'created_at',
      title: 'Publisher', data: 'publisher',
      title: 'Title', data: 'title',
    ]
  );

#authors_controllers.rb
def index
  @authors = Author.where(author: params[:author])
  render json:  data: @authors 
end

【讨论】:

请注意,像这样插入它可能会导致问题。 JavaScript 应该使用 j 帮助器进行转义,否则包含 ' 字符的作者会破坏您的 JavaScript。此外,由于您将值直接插入 URL,因此您还应该encode special URL characters。从而导致类似&lt;%= j URI.encode_www_form_component(author) %&gt;【参考方案2】:

我没有安装必要的工具来测试这一点,但 jQuery DataTable 文档说您可以通过 ajax.data 选项提供自定义数据。

ajax.data 选项提供了向 请求,或根据需要修改正在提交的数据对象。

...

作为对象,ajax.data 选项用于扩展数据 DataTables 在内部构造以提交给服务器的对象。 这提供了一种添加其他静态参数的简单方法 到要发送到服务器的数据。对于动态计算 值,使用 ajax.data 作为函数(见下文)。

该文档还提供了示例场景,并进一步详细说明了可以提供的内容。

$('#AuthorsIndex').DataTable(
  ajax: 
    url: '/authors',
    data: author: '<%= j author %>'
  ,
  columns: [
    title: 'Publish Date', data: 'created_at',
    title: 'Publisher',    data: 'publisher',
    title: 'Title',        data: 'title'
  ]
);

然后在控制器中:

def index
  @authors = Author.where(author: params[:author])
  render json:  data: @authors 
end

【讨论】:

在大多数情况下,您希望前端与后端一致,而不是相反。您当前的 index 操作返回 JSON,带有专门用于 DataTabledata 属性。如果您添加选项ajax: /* ... */ dataSrc: '' 表示使用响应的根作为数据而不是使用默认的data 属性作为数据,您可以简单地render json: @authors。见:datatables.net/reference/option/ajax.dataSrc

以上是关于通过 Ajax 调用将变量传递给控制器的主要内容,如果未能解决你的问题,请参考以下文章

jQuery AJAX 调用 PHP 控制器

我可以通过 Ajax 将两个数组传递给控制器​​吗? (文件数组和整数数组)

使用 Ajax 将 @RequestBody 中的多个变量传递给 Spring MVC 控制器

将 KnockoutJS 可观察数组传递给 HTTP Post 控制器方法的 AJax 调用失败

Ajax 调用数据在 POST 期间未传递给控制器

Grails 不会将变量传递给嵌套模板