通过 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。从而导致类似<%= j URI.encode_www_form_component(author) %>
【参考方案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,带有专门用于 DataTable
的 data
属性。如果您添加选项ajax: /* ... */ dataSrc: ''
表示使用响应的根作为数据而不是使用默认的data
属性作为数据,您可以简单地render json: @authors
。见:datatables.net/reference/option/ajax.dataSrc以上是关于通过 Ajax 调用将变量传递给控制器的主要内容,如果未能解决你的问题,请参考以下文章
我可以通过 Ajax 将两个数组传递给控制器吗? (文件数组和整数数组)
使用 Ajax 将 @RequestBody 中的多个变量传递给 Spring MVC 控制器