Tôi có điều này trong bộ điều khiển của tôi:Làm cách nào để tạo khóa thông số mạnh tùy chọn nhưng vẫn lọc tham số được lồng trong đó?
params.require(:item).permit!
Giả sử đặc tả rspec này:
put :update, id: @item.id, item: { name: "new name" }
Nó hoạt động như mong đợi, không có lỗi. Tuy nhiên, nếu tôi sử dụng điều này:
put :update, id: @item.id, item: nil
Tôi nhận được ActionController::ParameterMissing
mà tôi không muốn nhận. Nó phải làm với các macro điều khiển mà tôi sử dụng cho các hành động khác và thông qua đó tôi không thể kiểm soát các thông số được gửi (các macro kiểm tra thông tin người dùng, vì vậy tôi không thực sự quan tâm đến việc thử nghiệm một hành động #update
, thay vào đó tôi chỉ kiểm tra before_filters cho nó).
Vì vậy, câu hỏi của tôi là: làm cách nào để tạo params[:item]
tùy chọn, nhưng vẫn lọc thuộc tính bên trong nó nếu nó hiện diện?
Một số ý tưởng tốt tại https://github.com/rails/rails/issues/9534. Về cơ bản, gợi ý là sử dụng '# fetch' thay vì' # require' vì nó có tham số thứ hai cho một mặc định, ví dụ: 'params.fetch (: item, {}). – mtjhax
@mtjhax tuyệt vời, thx! đó sẽ là giá trị đưa vào một câu trả lời. – srecnig