【问题标题】:Rails 5: Merging parameters in view - where to permit them?Rails 5:在视图中合并参数 - 在哪里允许它们?
【发布时间】:2017-07-23 10:42:24
【问题描述】:

Rails 5 中合并实际页面查询字符串以链接到新的新方法是什么?

假设我有页面http://localhost:3000?type=a,我想在页面上的链接中添加另一个查询参数:

<%= link_to root_path(params.merge(tech: "b")) do %>

但我得到:无法将未经许可的参数转换为哈希。 我应该在哪里允许参数?
我试图在 before_action 过滤器中这样做,但似乎为时已晚。

谢谢

编辑:

我的控制器:

class HomeController < ApplicationController
  before_action :permit_params

  ...

  private

  def permit_params
    params.permit(:tech, :type)
  end
end

【问题讨论】:

  • 您是否添加了tech 作为允许的参数?
  • 是的,我做到了。我已将控制器代码添加到问题中。

标签: ruby-on-rails ruby-on-rails-5 strong-parameters


【解决方案1】:

您只需要将要合并的参数列入白名单

<%= link_to 'Home', root_path(params.permit(:type, :tech).merge(tech: 'b')) %>

并获取/?tech=b&amp;type=a。如果你真的想要所有参数,你可以使用permit!

<% params.permit! %>
<%= link_to 'Home', root_path(params.merge(tech: 'b')) %>

这将为您提供/?action=index&amp;controller=home&amp;tech=b&amp;type=a,虽然这些键似乎没有搞砸任何事情,但很可能不需要(并且controller 和action 将被覆盖并且不会传递到您的控制器操作中) .注意:controller/action 是这样设置的,因为我正在执行我的 HomeController index 操作,而不是因为 root_path 指向的内容

我只是不认为我可以推荐这样做,但是(似乎有问题,imo)...坚持白名单。

【讨论】:

  • 好的,看来可以了。谢谢!但我想将所有参数列入白名单。只是&lt;% params.permit(:type, :tech) %&gt; 不起作用。为什么?
  • permit 返回一个新的 ActionController::Parameters 实例,并没有就地修改它。如果你想使用你定义的 permit_params 方法,你可以把它放在 HomeHelper 中,然后在视图中使用 permit_params 访问它,并在控制器中作为 helpers.permit_params 访问它(虽然可能是更好的方法)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-17
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 2013-09-14
相关资源
最近更新 更多