我有一個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'中作爲參數,你應該傳遞模型中存在的字段。