ruby-on-rails Rails 7:不允许的真实性令牌

5f0d552i  于 2023-05-08  发布在  Ruby
关注(0)|答案(1)|浏览(155)

我在别人在我被雇来帮忙的一个项目中制作的一个功能中发现了一个bug。这样做的程序员是不可用的,我在互联网上没有发现任何关于这个错误,所以我希望有人在这里有什么可能是问题的想法。
所涉及的模型是ProjectProjectFilterProjectFilter是通过一个turbo下拉列表创建的(顾名思义),根据用户的需要过滤现有的项目。
项目控制员:

def new_filter
  @filter = ProjectFilter.new filter_params
  respond_to do |format|
    format.html { render layout: nil }
  end
end

def create_filter
  index
end

private
 def filter_params
  p = params.permit(:sort_col, :sort_dir, filter: {})
  p.except(:filter).merge(p[:filter])
 end
  
 def filter_and_sort
   @projects_before_filtering = @projects
   filter_projects
   sort_projects
 end

 def filter_projects
   @filter = params[:filter]&.permit(:area_id, :vision, :country_code, :progress) || {}
   @filter.reject! { |_k, v| v.blank? }
   @projects = ProjectFilter.new(@filter).filter(@projects)
 end

下面是一些屏幕截图,说明它是如何工作的:
All projects & dropdown
One filter
Two filters
这些截图属于当前存储库的前一个版本(项目几个月前被搁置,当它重新启动时,公司抛弃了旧的存储库,并上传了一个新的副本,原因我不知道)。在这个旧版本中,该功能起作用。但即使回滚到新文件的第一次上载,它也不会。
我检查了两个仓库中的代码,发现在任何涉及此功能的文件中都没有任何差异:模型、控制器、视图,甚至配置文件。
在这种背景下,问题就来了:
在当前存储库中,当尝试使用该功能时,发生了三件不应该发生的事情:
1.当点击下拉列表的任何属性进行筛选时,下拉列表将消失并拒绝重新出现。单击“过滤器”按钮不会重新绘制下拉列表。它也不会创建过滤器。
1.在Chrome控制台中,我得到了一个Response has no matching <turbo-frame id="filter"> element错误,尽管存在一个带有id="filter"的HTML元素以供turbo目标。
1.(这是我最关心的一个)当点击任何一个属性来创建一个过滤器时,我在rails服务器控制台中得到这个错误:

Unpermitted parameters: :authenticity_token, :sort_col, :sort_dir, :filter. 
Context: { controller: ProjectsController, action: create_filter, request: 
#<ActionDispatch::Request:0x00007f944a714130>, params: {"authenticity_token"=>"[FILTERED]",
"sort_col"=>"", "sort_dir"=>"", "filter"=>{"vision"=>"startup", "area_id"=>"",
"country_code"=>"", "progress"=>""}, "controller"=>"projects", "action"=>"create_filter"} }

尽管允许参数,如上面的控制器所示。怎么能不允许真实性令牌呢?这不是自动允许的吗?
index下面的create_filter操作中放置一个调试器,我得到了以下结果:

params:
#<ActionController::Parameters {"authenticity_token"=>"[FILTERED]", "sort_col"=>"", 
"sort_dir"=>"", "filter"=>#<ActionController::Parameters {"vision"=>"startup", "area_id"=>"",
 "country_code"=>"", "progress"=>""} permitted: false>, "controller"=>"projects",
 "action"=>"create_filter"} permitted: false>

@filter:
#<ActionController::Parameters {"vision"=>"startup"} permitted: true>

这与旧存储库中相同调试器查询的结果完全相同。然而,该功能在旧版本中有效,但在新版本中无效。
我已经检查过的东西:

  • 配置文件:在不允许的参数上引发错误,在两个存储库中都不存在。
  • .gitignore,用于更改存储库时可能忽略的任何配置文件
  • turbo帧的HTML ID,据我所知,它们都存在。虽然我可能是错的,我是新的涡轮轨道。我一直在关注不允许的参数错误。

有什么我该查的吗?即使是远投也是受欢迎的,因为我彻底被难倒了。谢谢大家!

iklwldmw

iklwldmw1#

欢迎来到SO!
这不是一个完整的答案,但我想我看到了一些地方,你可以戳周围。
我检查了两个仓库中的代码,发现在任何涉及此功能的文件中都没有任何差异:模型、控制器、视图,甚至配置文件。
比较gemfilegemfile.lock文件。我敢打赌,你会看到破坏版本的变化,涡轮和/或热线。
另外,比较javascript文件,似乎该项目可能已经从Turbolinks切换到Hotwire的Turbo。
在Chrome控制台中,我得到一个Response has no matching element error,尽管存在一个id=“filter”的HTML元素供turbo定位。
它不能只是任何带有id="filter"的HTML元素,它必须是<turbo-frame>元素。这可能是这个问题的原因:
当点击下拉列表的任何属性进行筛选时,下拉列表将消失并拒绝重新出现。单击“过滤器”按钮不会重新绘制下拉列表。它也不会创建过滤器。
这并不明显,因为我猜这个项目是从旧的Turbolinks升级到Hotwire的Turbo的,旧的Turbolinks在普通的HTML元素上使用UJS标签,而Hotwire的Turbo需要专门的DOM元素(check out Hotwire if you're not familiar with it)。
至于不允许的参数,@engineersmnky是完全正确的,你假设参数是允许的,因为你看到它们在#filter_params中是允许的。但这不是被调用的方法:

def filter_and_sort
   @projects_before_filtering = @projects
   filter_projects #<- doesn't permit :authenticity_token, :sort_col, :sort_dir, :filter
   sort_projects #<- not shown in your code
 end

如果没有任何视图或JS代码,以及控制器的其余部分,很难进一步调试,但希望这能有所帮助。

相关问题