了解强参数的要求 - Rails

时间:2016-09-15 19:45:34

标签: ruby-on-rails

我有一个filters controller和一个tags的集成对象。我试图更新集成对象。我使用看起来像这样的强力params。

def filters_params
  params.require(:filters).permit(:tags)
end

require在强对数中究竟是什么?这是关键吗?我怎么能让这个工作?

2 个答案:

答案 0 :(得分:3)

params是您使用可能的HTML表单和Web浏览器将请求(文本消息)发送到Web服务器的参数的哈希对象。此请求消息通过机架解析为ruby Hash(Rails是http://rack.github.io/应用程序)。 rails app采用此http://www.rubydoc.info/gems/rack/Rack/Request req.params并根据请求路径通过适当的控制器将其路由到处理。路由在config/routes.rb文件中指定。

您的params是您发送到rails web app的params,已解析并转换为名为http://apidock.com/rails/ActionController/Parameters的代码结构 您可以通过在控制器中放置一些binding.pry https://github.com/pry/pry并检查此结构的类来轻松检查它。然后你只需点击apidock获取答案(还有动态的方法从控制台显示源代码)。

但要回答你的问题......

强参数是一种模式(数据结构)规范/验证。

所以params.require(:filters).permit(:tags)基本上意味着它需要一个看起来像这样的Hash:{filters: {tags: []}。如果您没有提供所需的内容,则会出现错误。如果你提供的东西不被允许,那就被忽略了。

强大的参数允许轻松的质量分配,但过滤/白名单。否则有人可以举例哈希:{user: {is_admin: true, id: 123}}。相反,您只能允许修改名称和地址,例如。更多信息:http://edgeguides.rubyonrails.org/action_controller_overview.html#strong-parameters

进行此类验证的其他可行的ruby库是http://dry-rb.org/gems/dry-validation/

顺便说一句,你可以看到它是如何工作的: http://apidock.com/rails/ActionController/Parameters/require

    def require(key)
      value = self[key]
      if value.present? || value == false
        value
      else
        raise ParameterMissing.new(key)
      end
    end

http://apidock.com/rails/ActionController/Parameters/permit

    def permit(*filters)
      params = self.class.new

      filters.flatten.each do |filter|
        case filter
        when Symbol, String
          permitted_scalar_filter(params, filter)
        when Hash then
          hash_filter(params, filter)
        end
      end

      unpermitted_parameters!(params) if self.class.action_on_unpermitted_parameters

      params.permit!
    end

正如您在本案中所看到的那样permitted_scalar_filterhttp://apidock.com/rails/ActionController/Parameters/permitted_scalar_filter

 def permitted_scalar_filter(params, key)
    if has_key?(key) && permitted_scalar?(self[key])
      params[key] = self[key]
    end

    keys.grep(/\A#{Regexp.escape(key)}\(\d+[if]?\)\z/) do |k|
      if permitted_scalar?(self[k])
        params[k] = self[k]
      end
    end
  end

我希望有了这些知识,你可以解决你的问题;)

答案 1 :(得分:0)

查看由rails表单呈现的html。在属性'name'的每个输入中,您应该看到类似'model [field]'的内容。如果您提交此表单,您的控制器将获得这样的参数:'{model:{field:value,other_field:value}}'。最后,如果你将方法require作为参数调用,你应该传递'model'。在“允许”作为参数时,您应该传递模型中存在的字段。