2017-10-20 22 views
6

Trong Rails 4 here is the question về CÁCH làm điều này. Những gì tôi muốn biết là, mặc dù điều này hoạt động, TẠI SAO nhật ký vẫn phàn nàn?Rails 5.1 - Tham số JSON được cho phép nhưng vẫn in dưới dạng chưa được gửi trong nhật ký

Trong Rails 5.1.3 Tôi có một cột JSON (letterhead) là một trong những thuộc tính mô hình của tôi (và bên trong json đó là một băm với các thuộc tính khác nhau mà tôi không quan tâm về danh sách trắng). Tôi chỉ muốn cho phép/đưa vào danh sách trắng chính cột đó.

Note on Rails 5.1.4

Có một cách Rails để làm điều này trong 5.1.4, xem this commit. Có một cuộc thảo luận khá dài here về github về điều này. Trong Rails 5.1.4 nó chỉ đơn giản đây là:

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

Tham số :letterhead được phép, không có lỗi cho thấy trong nhật ký và các mô hình tiết kiệm. Nhưng rõ ràng nó cho phép đầu vào tùy ý bên trong tham số đó, do đó, sử dụng cẩn thận.

Nếu bạn muốn hạn chế mà các phím băm được phép vào bên trong một tham số như vậy, sau đó bạn cũng có thể tạo danh sách trắng đó, như thế này ví dụ:

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

này bây giờ ngăn bất kỳ phím tùy ý khác bên trong :letterhead kể từ khi tôi đã dứt khoát chỉ được phép những 3 - :address, :logo, :contact_info

Rails 5.1.3 (trở về trước)

012.

tôi có thể cho phép cột này bằng cách sử dụng các nội dung sau (xem thảo luận liên kết cho các tùy chọn có thể khác cũng):

Lựa chọn 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 

Lựa chọn 2

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

Trong cả hai trường hợp, mô hình tiết kiệm nhưng trong nhật ký nó vẫn nói "thông số chưa được gửi: tiêu đề thư"

  1. Tại sao vẫn nói rằng khi tôi đã cho phép rõ ràng?

  2. Ngoài ra, có sự khác biệt thực sự nào giữa Tùy chọn 1 và Tùy chọn 2 không?

EDIT

dữ liệu là như thế này:

{"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

Dữ liệu đến của bạn có dạng như thế nào? – 7urkm3n

+0

@ 7urkm3n Tôi đã thêm bản chỉnh sửa hiển thị dữ liệu – rmcsharry

+0

bạn thấy lỗi nào (khiếu nại)? Bạn có thể đăng nhật ký và phương thức sử dụng không? – 7urkm3n

Trả lời

1

Tại sao vẫn nói rằng khi tôi đã dứt khoát phép nó?

Nhật ký xuất phát từ #unpermitted_parameters! được gọi là #permit.Tất cả điều này xảy ra trước khi gọi tới #tap.

Có sự khác biệt thực sự nào giữa Tùy chọn 1 và Tùy chọn 2 không?

Sự khác biệt nắm để

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

vs

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

Sau đó sẽ dẫn đến NoMethodError nếu :letterhead không được thông qua vì params[:account][:letterhead] sẽ trở lại nil. Trước đây, trả về một băm rỗng của các tham số thay thế.

+0

Cảm ơn bạn đã trả lời toàn diện cho cả hai câu hỏi. Tuy nhiên đoạn cuối cùng không có ý nghĩa. Bạn nói sau này sẽ dẫn đến NoMethodError ... sẽ trả về nil. Nó không thể trả lại cả hai? Ngoài ra câu cuối cùng đã kết thúc - nó kết thúc bằng một dấu ngoặc vuông? – rmcsharry

+1

@rmcsharry, đoạn cuối cùng là một loại do Kinesis của tôi ;-) Những gì tôi có trong tâm trí là sự khác biệt giữa '# []' và '# fetch'. Nếu ': letterhead' không được thông qua thì' params [: account] [: letterhead] 'là' nil' và 'nil' không định nghĩa' #permit! '. –

+0

Tôi thấy bây giờ, cảm ơn vì đã làm rõ. Bạn xứng đáng được thưởng :) – rmcsharry

Các vấn đề liên quan