![](/img/trans.png)
[英]action controller strong params with value that can be either scalar OR array?
[英]Declare that the value in strong params must NOT be an array or of a one scalar type
應用程序接受 GET 請求以索引產品並接受page
參數(應該是整數)。
例如http://localhost/products?page=2
有沒有辦法確保它真的是 integer?
或者實際上問題是:有沒有辦法確保它不是數組?
例如http://localhost/products?page[]=2
或http://localhost/products?page[random_key]=2
這將導致代碼某處出錯。
現在,我知道有一種方法可以聲明它應該是一個數組或一個 json:
要聲明 params 中的值必須是允許標量值的數組,map 是空數組的鍵:
params.permit(id: [])
我能想到的最簡單的方法就是直接測試它是否不是數組:
run_the_code unless params[:page].is_a?(Array)
# or
run_the_code if params[:page].is_a?(Integer)
但是沒有更簡單的方法來使用 ActionParameters API 嗎?
例如
params.permit(page: :integer)
強參數 API 實際上只設計用於做一件事——將參數切分到白名單,以避免惡意用戶設法分配他們不應該分配的屬性的大規模分配漏洞。 它不關心驗證參數的存在或類型。 那不是它的工作。
如果您只使用.permit(:page)
,則不必擔心它是一個數組,因為允許的標量類型不包括哈希或 arrays。但這實際上更多地用於防止 setter 方法可以接受的漏洞利用a hash 然后驗證參數的類型。
還有一個小事實,即表單數據對(在查詢和請求正文中)都沒有類型化——它只是字符串,實際上只是將參數轉換為預期類型的后端。 params[:page].is_a?(Integer)
因此將始終為假。 除了解析哈希和 arrays Rack 實際上沒有任何內置類型提示,例如?page(i)=2
就像您在某些框架中會發現的那樣。
通常在 Rails 中,model 處理用戶輸入的類型轉換並提供驗證。
# this is ridiculously overkill
class Paginator
include ActiveModel::Model
include ActiveModel::Attributes
attribute :page, :integer
attribute :per_page, :integer
validates :page, numericality: { only_integer: true }
validates :per_page, numericality: { only_integer: true }
def to_query
attributes.symbolize_keys.compact_blank
end
end
paginator = Paginator.new(params.permit(:page, :per_page))
if paginator.valid?
Othermodel.paginate(**paginator.to_query)
end
然而,有些 gem 提供替代方法,例如干式驗證,或者您可以簡單地編寫一個方法,如果不能將參數強制轉換為非零值 integer 則拒絕該參數。
private
def page
params.permit(:page).to_i.then{ |n| n.zero? ? nil : n }
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.