我在应用程序中使用Rails 5和Jquery Datatables。我的数据表上有一个过滤字段。我希望人们能够点击标签并获得由该标签过滤的主表。看似简单的方法是link_to
这样:
posts_path(post: {filter: 'science'})
这会创建如下的网址:
http://localhost:3000/posts?post%5Bfilter%5D=science
然后我在控制器index
操作中执行此操作:
@posts = Post.all
@filter = post_params[:filter]
使用标准的强params方法,如:
def post_params
params.require(:post).permit(:filter ...)
end
然后在DataTable的Javascript中我做了这个:
$('#posts_table').dataTable({
saveState: true,
"lengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]],
search: {
search: '<%= @filter %>'
},
"columnDefs": [
{
"targets": [-1],
"visible": false,
"searchable": true
}
]
});
效果很好!!页面加载了在搜索词上过滤的表格,该词语出现在搜索文本框中。但是当我在没有任何参数的情况下调用索引页面时它会失败:
http://localhost:3000/posts
ActionController::ParameterMissing at /posts
param is missing or the value is empty: post
我得到的是因为没有发送参数但是我调用了params方法。有没有一种简单的方法来解决这个问题?即我可以使默认路由有一个默认的参数,其中一个空字符串作为搜索项吗?该路由的正确语法是什么?我以为我可以把参数设置为&#39;&#39;&#39;如果未定义但不确定如何以不会危及安全性的方式使用强Params。
答案 0 :(得分:0)
嗯,我知道这不会太困难,而且可能过度思考了。我终于为标签制作了一条路线:
get 'tags', to: 'posts#by_tag', as: :filter, :constraints => { :filter => /[^\/]+/ }
然后我添加了一个名为by_tag
的控制器动作,如下所示:
def by_tag
@posts = Post.all
@filter = post_params[:filter]
respond_to do |format|
format.html { render :index }
end
end
然后创建我的标记链接我只做:
tags.each do |t|
link_to t.name, filter_path(post: {filter: t.name})
end
创建如下链接:
http://localhost:3000/tags?post%5Bfilter%5D=9500XL
使用问题中提到的JavaScript,我得到了在搜索字段中应用过滤器的表格。
关于by_tag
动作的一些事情感觉有点不受欢迎。我觉得我错过了一些简单的东西,这些东西可以让我利用index
行动。如果有人有更好的答案,我很乐意知道。