Params rel dijelaskan?

228

Adakah yang bisa menjelaskan paramsdalam pengontrol Rails: dari mana asalnya, dan apa yang mereka rujuk?

  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

Saya ingin dapat membaca kode ini baris demi baris dan memahami apa yang terjadi.

Dru
sumber
2
Apa latar belakang Anda dalam pengembangan web sisi server? Teknologi apa yang sudah Anda ketahui?
Maurício Linhares
3
Saya sudah menggunakan HTML dan CSS selama bertahun-tahun. Diambil kelas yang menggunakan PHP, JS, dan Java. Digunakan sangat sedikit MVC dengan php. Saya benar-benar belajar pemrograman menggunakan Java. Dan saya benar-benar mengerti teori basis data.
Dru

Jawaban:

281

Params datang dari browser pengguna ketika mereka meminta halaman. Untuk permintaan HTTP GET, yang paling umum, params dikodekan dalam url. Misalnya, jika browser pengguna diminta

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

maka params[:foo]akan menjadi "1" dan params[:boo]akan menjadi "gurita".

Dalam HTTP / HTML, params benar-benar hanya serangkaian pasangan nilai kunci di mana kunci dan nilainya adalah string, tetapi Ruby on Rails memiliki sintaks khusus untuk membuat params menjadi hash dengan hash di dalamnya. Misalnya, jika browser pengguna diminta

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

maka params[:vote]akan menjadi hash, params[:vote][:item_id]akan menjadi "1" dan params[:vote][:user_id]akan menjadi "2".

Params Ruby on Rails setara dengan array $ _REQUEST di PHP .

David Grayson
sumber
13
Setara dengan $ _REQUEST kecuali $ _REQUEST mencakup data get, post, dan cookie, sementara params hanya mendapatkan dan memposting data.
Parziphal
3
@ POSR data POST termasuk dalam paramshash Rails juga. Data cookie termasuk dalam sessionhash.
Richard Jones
Jawaban ini menghilangkan satu sumber params lainnya: URL. Lihat jawaban hammar untuk informasi lebih lanjut.
Richard Jones
1
toasterlovin, sepertinya Anda tidak membaca kalimat kedua dari jawaban saya atau melihat contoh pertama.
David Grayson
1
@AnkitDhingra ... Saya pikir itu akan selalu menjadi string karena HTTP params benar-benar hanya pasangan kunci / nilai dan Rails (kemungkinan besar Rack gem) mem-parsing menjadi hash dan array sesuai dengan nilai kunci, tapi saya belum melihat hal semacam itu. yang memberi tahu Rails bahwa nilainya adalah angka.
rubyprince
75

Seperti yang telah ditunjukkan orang lain, paramsnilai bisa berasal dari string kueri permintaan GET, atau data formulir dari permintaan POST, tetapi ada juga tempat ketiga dari mana mereka berasal: Jalur URL.

Seperti yang mungkin Anda ketahui, Rails menggunakan sesuatu yang disebut rute untuk mengarahkan permintaan ke tindakan pengontrol yang sesuai. Rute ini dapat berisi segmen yang diekstrak dari URL dan dimasukkan ke dalam params. Misalnya, jika Anda memiliki rute seperti ini:

match 'products/:id', ...

Kemudian permintaan ke URL seperti http://example.com/products/42akan diatur params[:id]ke 42.

hammar
sumber
Bagaimana Anda mendapatkan param kedua? seperti / squad / id / anggota / id / stuff
weteamsteve
48

Params berisi tiga grup parameter berikut:

  1. Parameter yang disediakan pengguna
    • DAPATKAN (http://domain.com/url?param1=value1¶m2=value2 akan mengatur params [: param1] dan params [: param2])
    • POST (mis. JSON, XML akan secara otomatis diuraikan dan disimpan dalam params)
    • Catatan: Secara default, Rails menduplikasi parameter yang disediakan pengguna dan menyimpannya di params [: user] jika di UsersController, dapat diubah dengan pengaturan wrap_parameters
  2. Parameter perutean
    • match '/user/:id' di routes.rb akan mengatur params [: id]
  3. Parameter default
    • params[:controller]dan params[:action]selalu tersedia dan berisi controller dan action saat ini
thejaz
sumber
1
Bisakah Anda memperluas Catatan Anda di bawah User supplied parameterslebih sedikit? Misalnya, contoh hash params di UsersController akan sangat membantu. Contoh Anda membuatnya terdengar seperti hash akan terlihat seperti: {first_name: "mike", user: {first_name: "mike"} ...} Apakah itu benar?
7stud
1
Saya tidak melihat itu di rails4. Misalnya {"_method"=>"put", "authenticity_token"=>"gubHya6uQrQLjPRXhOC0RUuCRdn7NFr6CeKrbRfBSHI=", "ripe"=>"true", "action"=>"update", "controller"=>"apples", "id"=>"4"},. Maafkan saya jika saya salah, saya pemula pemula. Menurut catatan Anda, saya harus melihat: {"_method"=>"put", "authenticity_token"=>"gubHya6uQrQLjPRXhOC0RUuCRdn7NFr6CeKrbRfBSHI=", "ripe"=>"true", "apple" => {"ripe"=>"true"}, "action"=>"update", "controller"=>"apples", "id"=>"4"} Saya tidak tahu apakah itu ada hubungannya dengan parameter yang kuat di rails4 atau tidak.
7stud
2
Saya melihat params duplikat di Rails 4, tetapi hanya di bawah permintaan json POST (menggunakan Angularjs) tidak di bawah posting HTML Rails sendiri. Tautan ini menjelaskan alasannya: stackoverflow.com/questions/10774972/...
Homan
13

Pada dasarnya, parameter adalah data yang ditentukan pengguna untuk aplikasi rails.

Ketika Anda memposting suatu formulir, Anda melakukannya secara umum dengan permintaan POST, bukan permintaan GET. Anda dapat menganggap permintaan rel normal sebagai MENDAPATKAN permintaan, ketika Anda menelusuri situs, jika itu membantu.

Saat Anda mengirimkan formulir, kontrol dilemparkan kembali ke aplikasi. Bagaimana Anda mendapatkan nilai yang telah Anda kirimkan ke formulir? paramsadalah bagaimana.

Tentang kode Anda. @vote = Vote.new params[:vote]membuat Vote to database baru menggunakan data params [: vote]. Mengingat formulir yang Anda kirimkan oleh pengguna diberi nama: suara, semua datanya ada di ini: bidang suara hash.

Dua baris berikutnya digunakan untuk mendapatkan item dan pengguna uid telah mengirimkan ke formulir.

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

menemukan yang terbaru, atau yang terakhir disisipkan, memilih dari basis data dengan ketentuan item_id = item dan user_id = uid.

Baris berikutnya membutuhkan waktu pemungutan suara terakhir dan waktu saat ini.

Smar
sumber
6

Di sisi Rails, paramsadalah metode yang mengembalikan ActionController::Parametersobjek. Lihat https://stackoverflow.com/a/44070358/5462485

Margotte
sumber
3
+1 untuk menjelaskan bahwa itu paramsadalah metode. Ruby dapat mempersulit membedakan variabel dari metode
samrap