2017-10-20 45 views
6

在Rails 4 here is the question有關如何做到這一點英寸我想知道的是,雖然這是有效的,但爲什麼日誌仍然在抱怨?的Rails 5.1 - JSON參數是允許的,但仍作爲打印未經許可的日誌

在Rails 5.1.3中,我有一個JSON列(letterhead)作爲我的一個模型屬性(並且裏面的那個json是一個包含各種屬性的散列,我不關心白名單)。我只是想允許/列入白名單本身。

注on Rails的5.1.4

有一個Rails的方式做到這一點在5.1.4,看到this commit。 在github上有一個相當長的討論here。在Rails 5.1.4它很簡單:

def account_params 
    params.require(:account).permit(:id, :name, :plan_id, letterhead: {}) 
end 

:letterhead參數是允許的,沒有錯誤顯示在日誌中和模型撲救。但顯然它允許在該參數內部的任意輸入,所以小心使用。

如果你是想限制其哈希鍵被允許這樣的參數裏面,那麼你也可以加入白名單的,像這樣的例子:

def account_params 
    params.require(:account).permit(:id, :name, :plan_id, letterhead: [:address, :logo, :contact_info]) 
end 

現在,這可以防止任何其他任意鍵:letterhead因爲我已明確只允許這些3 - :address, :logo, :contact_info

的Rails 5.1.3(或更早)

餘可使用的任允許此列中的以下(見其他可能的選項也被鏈接討論):

選項1

def account_params 
    params.require(:account).permit(:id, :name, :plan_id, :letterhead).tap do |whitelisted| 
    whitelisted[:letterhead] = params[:account].fetch(:letterhead, ActionController::Parameters.new).permit! 
    end 
end 

選項2

def account_params 
    params.require(:account).permit(:id, :name, :plan_id, :letterhead).tap do |whitelisted| 
    whitelisted[:letterhead] = params[:account][:letterhead].permit! 
    end 
end 

在這兩種情況下,模型都會保存,但在日誌中仍然會顯示「未經許可的參數:信頭」

  1. 爲什麼仍然說,當我已經明確允許的嗎?

  2. 此外,有沒有選項1和選項2之間的任何真實的差異?

編輯

的數據是這樣的:

{"id"=>"a61151b8-deed-4efa-8cad-da1b143196c9", 
"plan_id"=>"1dc49acf-3111-4030-aea1-7db259b53a51", 
"name"=>"Test Account 1", 
"is_active"=>true, 
"letterhead"=>{"left"=>"", "center"=>"", "right"=>""}, 
"created_by"=>nil, 
"updated_by"=>nil, 
"created_at"=>"2017-10-14T19:05:40.197Z", 
"updated_at"=>"2017-10-20T15:14:08.194Z"} 
+0

如何讓傳入的數據看起來像? – 7urkm3n

+0

@ 7urkm3n我添加了一個顯示數據的編輯 – rmcsharry

+0

你看到了什麼樣的錯誤(抱怨)?你可以發表年度日誌和使用方法嗎? – 7urkm3n

回答

1

爲什麼仍然說,當我已經明確允許的嗎?

日誌來自#unpermitted_parameters!這是由#permit調用。所有這一切發生在之前呼叫#tap

選項1和選項2之間是否有實際區別?

的差異歸結爲

params[:account].fetch(:letterhead, ActionController::Parameters.new).permit! 

VS

params[:account][:letterhead].permit! 

後者將導致NoMethodError如果:letterhead沒有通過,因爲params[:account][:letterhead]將返回nil。前者返回參數的空哈希值。

+0

謝謝你對這兩個問題的全面回答。但最後一段沒有意義。你說後者會導致NoMethodError ...將返回零。它不能同時返回?還有最後一句完成 - 它以方括號結束? – rmcsharry

+1

@rmcsharry,最後一段是由於我的Kinesis類型;-)我想到的是'#[]'和'#fetch'之間的區別。如果':letterhead'沒有通過,那麼'params [:account] [:letterhead]'是'nil','nil'不會定義'#permit!'。 –

+0

我現在看到了,謝謝澄清。你應得的獎金:) – rmcsharry