加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 了解强参数的要求 – Rails

发布时间:2020-12-17 02:26:05 所属栏目:百科 来源:网络整理
导读:我有一个过滤器控制器和一个带有标签的集成对象.我正在尝试更新集成对象.我正在使用看起来像这样的强大的参数. def filters_params params.require(:filters).permit(:tags)end 强对数的要求究竟是什么?这是关键吗?我怎么能做这个工作? 解决方法 params是
我有一个过滤器控制器和一个带有标签的集成对象.我正在尝试更新集成对象.我正在使用看起来像这样的强大的参数.

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

强对数的要求究竟是什么?这是关键吗?我怎么能做这个工作?

解决方法

params是您使用可能的HTML表单和Web浏览器将请求(文本消息)发送到Web服务器的参数的哈希对象.此请求消息通过机架解析为ruby Hash(Rails是一个 http://rack.github.io/应用程序).
rails应用程序使用此 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

正如你在这种情况下所看到的那样,它是allowed_scalar_filter:
http://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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读