Rails是否可以有一个link_to将param传递给jquery数据表过滤器?

时间:2018-05-11 00:13:42

标签: ruby-on-rails ruby

我在应用程序中使用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。

1 个答案:

答案 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行动。如果有人有更好的答案,我很乐意知道。