我有一个filters controller
和一个tags
的集成对象。我试图更新集成对象。我使用看起来像这样的强力params。
def filters_params
params.require(:filters).permit(:tags)
end
require
在强对数中究竟是什么?这是关键吗?我怎么能让这个工作?
答案 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_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
我希望有了这些知识,你可以解决你的问题;)
答案 1 :(得分:0)
查看由rails表单呈现的html。在属性'name'的每个输入中,您应该看到类似'model [field]'的内容。如果您提交此表单,您的控制器将获得这样的参数:'{model:{field:value,other_field:value}}'。最后,如果你将方法require作为参数调用,你应该传递'model'。在“允许”作为参数时,您应该传递模型中存在的字段。