2016-09-15 77 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'中作爲參數,你應該傳遞模型中存在的字段。