2016-09-15 73 views
2

我有一个filters controller和具有tags的集成对象。我正在尝试更新集成对象。我正在使用看起来像这样的强大参数。了解强参数的要求 - 导轨

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

require究竟是什么强烈的参数?是关键吗?我怎么能做这个工作?

回答

2

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.pryhttps://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_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 

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

0

查看由轨道形式呈现您的HTML。在属性'name'的每个输入中,您应该看到类似于“areodel [field]”的内容。如果你提交这个表单,你的控制器会得到这样的参数:'{model:{field:value,other_field:value}}'。最后,如果你调用方法require作为参数,你应该通过“amodel”。在'permit'中作为参数,你应该传递模型中存在的字段。