Rails中link_to传参至jQuery Datatable过滤器的报错解决问询
解决Rails 5 + jQuery Datatable无参数访问报错的问题
这个问题我之前也碰到过,核心原因就是强参数里的require方法太严格了——当没有post参数的时候,它直接就抛出ActionController::ParameterMissing错误了。给你两个安全又简单的解决思路:
方法一:修改强参数,允许post参数可选
把强参数里的require换成fetch,并设置默认值为空哈希,这样即使没有post参数,也不会报错。
修改你的post_params方法:
def post_params # 当params里没有:post时,返回空哈希{},再执行permit params.fetch(:post, {}).permit(:filter) end
然后在index动作里获取过滤参数:
@filter = post_params[:filter]
最后在JS初始化Datatable的时候,处理一下空值的情况(避免渲染出nil导致JS语法错误):
$(document).ready(function() { $('#posts-table').DataTable({ // 其他配置项... search: { // 用j方法转义字符串,同时处理nil的情况 search: '<%= j @filter || '' %>' } }); });
方法二:改用根层级参数(更简洁)
如果只是过滤需求,没必要把参数嵌套在post下,直接用根层级的参数更方便,还能避免嵌套参数带来的问题。
首先修改link_to的生成方式:
link_to 'Science', posts_path(filter: 'science')
此时URL会变成http://localhost:3000/posts?filter=science,更简洁。
然后在控制器里直接获取参数(如果需要强参数验证也可以加上):
# 直接获取参数,无参数时返回nil @filter = params[:filter] # 可选:添加参数白名单验证,防止恶意输入 ALLOWED_FILTERS = ['science', 'tech', 'art'] # 你的合法标签列表 @filter = ALLOWED_FILTERS.include?(@filter) ? @filter : nil
JS部分和方法一一样,处理空值即可。
额外安全提示
不管用哪种方法,都建议对@filter做取值范围验证(比如上面的ALLOWED_FILTERS),防止用户通过篡改URL传入非法参数,保证数据过滤的安全性。
内容的提问来源于stack exchange,提问作者Beartech
相关产品推荐
相关产品推荐

