2013-07-16 27 views
15

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?

+4

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

+0

@mtjhax tuyệt vời, thx! đó sẽ là giá trị đưa vào một câu trả lời. – srecnig

Trả lời

25

gì về:

params.require(:item).permit! if params[:item]

Bạn không thể yêu cầu một tham số tùy chọn. Đó là mâu thuẫn.

Chỉnh sửa: như mtjhax nêu trong bình luận của mình, có lời khuyên từ here sử dụng fetch thay vì: params.fetch(:item, {}).permit!

+1

Tôi nghĩ bạn hiểu sai câu hỏi của mình. Nó hoàn toàn hợp lệ để muốn yêu cầu thùng chứa chính (: item) trong khi chỉ tạo một số thuộc tính con bên trong của nó, ngoài việc sử dụng 'params.require (: item) .permit!' (Cho phép bất kỳ tham số nào miễn là chúng nằm trong ': item' và': item' tồn tại dường như không thể theo cách chi tiết. –

+0

@OlivierLacan đọc lại, tôi nghĩ bạn có thể đúng, mặc dù bây giờ tôi đã nhầm lẫn tại sao anh ấy chấp nhận câu trả lời của tôi nó không giải quyết được vấn đề của anh ta. –