我有一个filters controller
和具有tags
的集成对象。我正在尝试更新集成对象。我正在使用看起来像这样的强大参数。了解强参数的要求 - 导轨
def filters_params
params.require(:filters).permit(:tags)
end
require
究竟是什么强烈的参数?是关键吗?我怎么能做这个工作?
我有一个filters controller
和具有tags
的集成对象。我正在尝试更新集成对象。我正在使用看起来像这样的强大参数。了解强参数的要求 - 导轨
def filters_params
params.require(:filters).permit(:tags)
end
require
究竟是什么强烈的参数?是关键吗?我怎么能做这个工作?
params
是您使用可能的HTML表单和Web浏览器向请求(文本消息)发送给Web服务器的参数的哈希对象。这个请求消息被解析为一个红宝石哈希机架(Rails是一个http://rack.github.io/应用程序)。 Rails应用程序需要此http://www.rubydoc.info/gems/rack/Rack/Requestreq.params
并根据请求路径通过适当的控制器进行路由。路由在config/routes.rb
文件中指定。
你params
是您发送到轨道的Web应用程序参数,可以解析,变成了代号为结构http://apidock.com/rails/ActionController/Parameters 您可以轻松地在控制器中的一些binding.pry
https://github.com/pry/pry和检查类这种结构的检验。然后,您只需打开apidock寻找答案(还有从控制台显示源代码的动态方法)。
但要回答你的问题......
强大的参数是一种架构(数据结构)规格/验证。
所以params.require(:filters).permit(:tags)
基本上意味着它期望一个哈希看起来像这样:{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
我希望有了这些知识,你可以解决你的问题;)
查看由轨道形式呈现您的HTML。在属性'name'的每个输入中,您应该看到类似于“areodel [field]”的内容。如果你提交这个表单,你的控制器会得到这样的参数:'{model:{field:value,other_field:value}}'。最后,如果你调用方法require作为参数,你应该通过“amodel”。在'permit'中作为参数,你应该传递模型中存在的字段。