Rails params giải thích?


228

Bất cứ ai cũng có thể giải thích paramstrong bộ điều khiển Rails: họ đến từ đâu, và những gì họ đang tham khảo?

  def create
    @vote = Vote.new(params[:vote])
    item = params[:vote][:item_id]
    uid = params[:vote][:user_id]
    @extant = Vote.find(:last, :conditions => ["item_id = ? AND user_id = ?", item, uid])
    last_vote_time = @extant.created_at unless @extant.blank?
    curr_time = Time.now
  end

Tôi muốn có thể đọc từng dòng mã này và hiểu những gì đang diễn ra.


2
Nền tảng của bạn về phát triển web phía máy chủ là gì? Những công nghệ nào bạn đã biết?
Maurício Linhares

3
Tôi đã gắn bó với HTML và CSS trong nhiều năm. Lấy các lớp đã sử dụng PHP, JS và Java. Mặc dù sử dụng rất ít MVC với php. Tôi thực sự đã học lập trình bằng Java. Và tôi hiểu thấu đáo lý thuyết cơ sở dữ liệu.
Dru

Câu trả lời:


281

Các thông số đến từ trình duyệt của người dùng khi họ yêu cầu trang. Đối với một yêu cầu HTTP GET, phổ biến nhất, các thông số được mã hóa trong url. Ví dụ: nếu trình duyệt của người dùng yêu cầu

http://www.example.com/?foo=1&boo=octopus

sau đó params[:foo]sẽ là "1" và params[:boo]sẽ là "bạch tuộc".

Trong HTTP / HTML, các tham số thực sự chỉ là một chuỗi các cặp khóa-giá trị trong đó khóa và giá trị là các chuỗi, nhưng Ruby on Rails có một cú pháp đặc biệt để làm cho các tham số trở thành hàm băm bên trong. Ví dụ: nếu trình duyệt của người dùng yêu cầu

http://www.example.com/?vote[item_id[=1&vote[user_id[=2

sau đó params[:vote]sẽ là một hàm băm, params[:vote][:item_id]sẽ là "1" và params[:vote][:user_id]sẽ là "2".

Các tham số Ruby on Rails tương đương với mảng $ _REQUEST trong PHP .


13
Tương đương với $ _REQUEST ngoại trừ $ _REQUEST bao gồm dữ liệu get, post và cookie, trong khi params chỉ nhận và đăng dữ liệu.
Parziphal

3
Dữ liệu POST @renocor cũng được bao gồm trong paramshàm băm Rails . Dữ liệu cookie được bao gồm trong sessionhàm băm.
Richard Jones

Câu trả lời này bỏ qua một nguồn thông số khác: URL. Xem câu trả lời của hammar để biết thêm thông tin.
Richard Jones

1
toasterlovin, có vẻ như bạn đã không đọc câu thứ hai trong câu trả lời của tôi hoặc nhìn vào ví dụ đầu tiên.
David Grayson

1
.... thông báo cho Rails rằng giá trị là một số.
rubyprince

75

Như những người khác đã chỉ ra, paramscác giá trị có thể đến từ chuỗi truy vấn của yêu cầu GET hoặc dữ liệu biểu mẫu của yêu cầu POST, nhưng cũng có một vị trí thứ ba mà chúng có thể đến từ: Đường dẫn của URL.

Như bạn có thể biết, Rails sử dụng một cái gì đó được gọi là các tuyến đường để yêu cầu trực tiếp đến các hành động điều khiển tương ứng của chúng. Các tuyến này có thể chứa các phân đoạn được trích xuất từ ​​URL và đưa vào params. Ví dụ: nếu bạn có một tuyến đường như thế này:

match 'products/:id', ...

Sau đó, một yêu cầu đến một URL như http://example.com/products/42sẽ được đặt params[:id]thành 42.


Làm thế nào để bạn có được một param thứ hai? like / squad / id / thành viên / id / Stuff
weteamsteve

48

Params chứa ba nhóm tham số sau:

  1. Thông số người dùng cung cấp
    • NHẬN (http://domain.com/url?param1=value1¶m2=value2 sẽ đặt params [: param1] và params [: param2])
    • POST (ví dụ JSON, XML sẽ tự động được phân tích cú pháp và được lưu trữ trong params)
    • Lưu ý: Theo mặc định, Rails sao chép các tham số do người dùng cung cấp và lưu trữ chúng trong params [: user] nếu trong UsersContoder, có thể được thay đổi với cài đặt quấn_parameter
  2. Thông số định tuyến
    • match '/user/:id' trong Rout.rb sẽ đặt params [: id]
  3. Thông số mặc định
    • params[:controller]params[:action]luôn có sẵn và chứa bộ điều khiển và hành động hiện tại

1
Bạn có thể mở rộng Lưu ý của bạn dưới User supplied parametersmột chút nữa không? Ví dụ, một ví dụ về hàm băm params trong UsersContoder sẽ hữu ích. Ví dụ của bạn làm cho âm thanh giống như hàm băm sẽ trông giống như: {first_name: "mike", user: {first_name: "mike"} ...} Điều đó có đúng không?
7st

1
Tôi không thấy điều đó trong rails4. Ví dụ , {"_method"=>"put", "authenticity_token"=>"gubHya6uQrQLjPRXhOC0RUuCRdn7NFr6CeKrbRfBSHI=", "ripe"=>"true", "action"=>"update", "controller"=>"apples", "id"=>"4"}. Hãy tha thứ cho tôi nếu tôi sai, tôi là người mới bắt đầu. Theo ghi chú của bạn, tôi sẽ thấy: {"_method"=>"put", "authenticity_token"=>"gubHya6uQrQLjPRXhOC0RUuCRdn7NFr6CeKrbRfBSHI=", "ripe"=>"true", "apple" => {"ripe"=>"true"}, "action"=>"update", "controller"=>"apples", "id"=>"4"} Tôi không biết điều đó có liên quan đến các tham số mạnh trong rails4 hay không.
7stud

2
Tôi đang thấy các thông số trùng lặp trong Rails 4, nhưng chỉ trong các yêu cầu POST json (sử dụng Angularjs) không thuộc các bài đăng HTML của Rails. Liên kết này giải thích lý do: stackoverflow.com/questions/10774972/ từ
Homan

13

Về cơ bản, các tham số là dữ liệu do người dùng chỉ định cho ứng dụng rails.

Khi bạn đăng một biểu mẫu, bạn thường thực hiện nó với yêu cầu POST trái ngược với yêu cầu GET. Bạn có thể nghĩ các yêu cầu rails bình thường là các yêu cầu GET, khi bạn duyệt trang web, nếu nó giúp.

Khi bạn gửi biểu mẫu, điều khiển sẽ được gửi trở lại ứng dụng. Làm thế nào để bạn có được các giá trị bạn đã gửi vào mẫu? paramstôi chỉ ra.

Về mã của bạn. @vote = Vote.new params[:vote]tạo Bình chọn mới cho cơ sở dữ liệu bằng cách sử dụng dữ liệu của params [: vote]. Với người dùng biểu mẫu của bạn đã gửi được đặt tên theo tên: phiếu bầu, tất cả dữ liệu của nó nằm trong trường này: trường bỏ phiếu của hàm băm.

Hai dòng tiếp theo được sử dụng để lấy vật phẩm và người dùng uid đã gửi biểu mẫu.

@extant = Vote.find(:last, :conditions => ["item_id = ? AND user_id = ?", item, uid])

tìm thấy mới nhất hoặc được chèn lần cuối, bỏ phiếu từ cơ sở dữ liệu với điều kiện item_id = item và user_id = uid.

Dòng tiếp theo mất thời gian bỏ phiếu cuối cùng và thời gian hiện tại.


6

Về phía Rails, paramslà một phương thức trả về một ActionController::Parametersđối tượng. Xem https://stackoverflow.com/a/44070353/5462485


3
+1 để làm rõ đó paramslà một phương pháp. Ruby có thể gây khó khăn cho việc phân biệt các biến với các phương thức
samrap
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.