Computer >> Máy Tính >  >> Lập trình >> Ruby

Tham số Rails là gì &Cách sử dụng chúng đúng cách

Hãy nói về các thông số Rails!

Tại sao chúng hữu ích?

Người dùng có thể gửi dữ liệu đến ứng dụng web của bạn theo ba cách khác nhau.

Ba cách này là :

  1. Sử dụng tham số truy vấn ("example.com/?q=bacon" )
  2. Gửi biểu mẫu ("/users/sign_in" )
  3. Trong chính URL ("/books/1" )

Làm cách nào để bạn truy cập dữ liệu này từ Rails?

Với params .

Bên trong hành động của bộ điều khiển của bạn bạn có thể gọi params để truy cập vào dữ liệu biểu mẫu và truy vấn URL .

params là gì , chính xác?

Đây là một phương thức trả về một ActionController::Parameters , trong thực tế, nó hoạt động rất giống một hàm băm.

Bây giờ.

Giả sử bạn muốn đọc một giá trị từ params này băm.

Đây là cách thực hiện :

params[:id]

Bạn nhận được giá trị nếu nó tồn tại.

Hoặc nil nếu không.

Vài điều cần biết :

  • Nếu một trường bị bỏ trống bạn sẽ nhận được một chuỗi trống
  • Tất cả các giá trị bên trong params là các chuỗi. Ngay cả khi chúng đã được gửi dưới dạng số nguyên

Hãy cùng tìm hiểu sâu hơn một chút về các thông số Rails vì nếu bạn không hiểu rõ về chúng chúng có thể là nguồn gây ra sự nhầm lẫn và các vấn đề kỳ lạ!

Quy ước Rails:Trường &Tham số biểu mẫu

Làm cách nào để các trường biểu mẫu &tham số URL ánh xạ tới params chìa khóa?

Tôi có một ví dụ cho bạn.

Đây :


Đây là một biểu mẫu tìm kiếm đơn giản sẽ gửi một yêu cầu ĐĂNG đến /search .

Kết quả là bạn sẽ nhận được params này đối tượng:

{ "q"=>"", "controller"=>"books", "action"=>"search" }

Đây là “q” là gì?

Đó là thuộc tính tên của trường nhập trong biểu mẫu HTML .

Tên có thể là bất cứ thứ gì bạn muốn.

Nếu bạn tạo biểu mẫu của mình bằng form_for phương thức trợ giúp, tên được tạo tự động cho bạn và chúng tuân theo một mẫu cụ thể.

Đây là một ví dụ :

# form_for(@book) with a few fields generates something like this


book[title] này định dạng trong tên trường sẽ tạo ra một params băm nơi các giá trị sẽ được lồng vào nhau.

Hãy để tôi giải thích bằng một ví dụ :

{
  "book"=>
    {
      "title"=>"",
      "author"=>"",
      "cover"=>"",
      "language"=>"English"
    }
}

Người dùng gửi một biểu mẫu trống và đây là những gì bạn nhận được.

Từ bộ điều khiển của bạn…

Bạn truy cập dữ liệu như thế này :

params[:book][:language]
# "English"

params[:book][:author]
# ""

Hãy nhớ rằng hàm này hoạt động giống như một hàm băm, nhưng không giống như một hàm băm thông thường, nó sẽ chấp nhận cả ký hiệu và chuỗi làm khóa tương đương.

Có nghĩa là params["book"] &params[:book] đều giống nhau.

Kích hoạt các tuyến của bạn để chấp nhận các tham số

Bên cạnh các tham số truy vấn, bạn cũng có thể bật các tham số kiểu REST.

Trong Rails, chúng tôi gọi đây là "phân đoạn động".

Hãy xem một ví dụ.

Nếu bạn có một tuyến đường như :

get 'books/:id', to: 'books#show'

Hoặc :

resources :books

Bạn sẽ có thể sử dụng các URL như thế này :

/books/1

Sau đó, bạn có thể truy cập 1 này , là id trong books/:id .

Với params .

Như thế này :

params[:id]

Điều này sẽ giúp bạn tìm thấy tài nguyên cụ thể mà người dùng đang tìm kiếm.

Book.find(params[:id])

Hiểu các thông số mạnh

Tiếp theo:

Nếu bạn cố gắng lưu một đối tượng vào cơ sở dữ liệu của mình, nhưng nó dường như không hoạt động.

Xem nhật ký máy chủ rails của bạn.

Bạn có thể thấy cái này :

Unpermitted parameter: :language

Điều này có nghĩa là gì?

Rails đã giới thiệu hệ thống "tham số mạnh", trở lại trong Rails 4 như một tính năng bảo mật.

Nó buộc bạn phải đưa các thuộc tính vào danh sách trắng có thể được lưu.

Điều này ngăn chặn một vấn đề được gọi là "chuyển nhượng hàng loạt", cho phép người dùng độc hại đặt admin = true hoặc đặt các trường khác mà thông thường họ sẽ không có quyền truy cập.

Bạn có thể đưa các trường như thế này vào danh sách trắng :

def book_params
  params.require(:book).permit(:title, :author, :cover, :language)
end

Điều này hoạt động như thế nào?

  • require phương thức sẽ tìm kiếm params[:book] &nêu lỗi nếu nó không có ở đó.
  • permit phương thức là danh sách các thuộc tính được phép (nhưng không bắt buộc).

Kết quả là bạn nhận lại một params mới băm với các thuộc tính này, nhưng bây giờ chúng rõ ràng đã được lưu vào cơ sở dữ liệu.

Ví dụ :

Book.create(book_params)

Lưu ý rằng một hàm băm Ruby thông thường sẽ vượt qua hệ thống bảo mật này.

Ví dụ :

Book.create(title: "", author: "", cover: "")

Điều này sẽ ổn nếu tên thuộc tính (như author ) được mã hóa cứng.

Tóm tắt

Bạn đã tìm hiểu về các tham số Rails, cách chúng hoạt động và cách sử dụng chúng một cách chính xác trong các dự án Rails của mình!

Bây giờ đến lượt bạn thực hành, ghi chú, đánh giá 🙂

Cảm ơn vì đã đọc.