Czy wyjaśniono parametry szyn?

228

Czy ktoś mógłby wyjaśnić paramsw kontrolerze Railsów: skąd pochodzi i do czego się odnosi?

  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

Chciałbym móc przeczytać ten kod wiersz po wierszu i zrozumieć, co się dzieje.

Dru
źródło
2
Jakie jest twoje doświadczenie w tworzeniu stron internetowych po stronie serwera? Jakie technologie już znasz?
Maurício Linhares
3
Używam HTML i CSS od lat. Uczęszczał na klasy korzystające z PHP, JS i Java. Użyłem bardzo mało MVC z php. Naprawdę nauczyłem się programowania za pomocą Java. Doskonale rozumiem teorię baz danych.
Dru

Odpowiedzi:

281

Parametry pochodzą z przeglądarki użytkownika, gdy żąda strony. W przypadku żądania HTTP GET, które jest najczęściej, parametry są kodowane w adresie URL. Na przykład, jeśli zażądała przeglądarki użytkownika

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

wtedy params[:foo]byłby „1” i params[:boo]byłby „ośmiornicą”.

W HTTP / HTML parametry są tak naprawdę serią par klucz-wartość, w których klucz i wartość są łańcuchami, ale Ruby on Rails ma specjalną składnię, dzięki której parametry są skrótem z hashami w środku. Na przykład, jeśli zażądała tego przeglądarka użytkownika

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

Następnie params[:vote]będzie mieszania, params[:vote][:item_id]to jest „1” i params[:vote][:user_id]będzie „2”.

Parametry Ruby on Rails są odpowiednikiem tablicy $ _REQUEST w PHP .

David Grayson
źródło
13
Odpowiednik $ _REQUEST z wyjątkiem tego, że $ _REQUEST zawiera dane dotyczące pobierania, wysyłania i plików cookie, podczas gdy parametry tylko pobierają i wysyłają dane.
Parziphal
3
Dane @renocor POST są również uwzględnione w paramshaszu Rails . Dane cookie są zawarte w sessionhaszu.
Richard Jones
Ta odpowiedź pomija jeszcze jedno źródło parametrów: adres URL. Aby uzyskać więcej informacji, zobacz odpowiedź Hammara.
Richard Jones
1
toasterlovin, wygląda na to, że nie przeczytałeś drugiego zdania mojej odpowiedzi ani nie spojrzałeś na pierwszy przykład.
David Grayson
1
@AnkitDhingra ... Myślę, że zawsze będzie ciągiem, ponieważ parametry HTTP są tak naprawdę tylko parą klucz / wartość, a Railsy (najprawdopodobniej klejnot Rack) analizują to w hasze i tablice zgodnie z wartością klucza, ale nie widziałem nic takiego co mówi Railsom, że wartość jest liczbą.
rubyprince
75

Jak zauważyli inni, paramswartości mogą pochodzić z ciągu zapytania GET lub danych formularza żądania POST, ale jest też trzecie miejsce, z którego mogą pochodzić: ścieżka adresu URL.

Jak zapewne wiesz, Railsy używają czegoś zwanego trasami do kierowania żądań do odpowiednich akcji kontrolera. Te trasy mogą zawierać segmenty wyodrębnione z adresu URL i umieszczone w nim params. Na przykład, jeśli masz taką trasę:

match 'products/:id', ...

Następnie żądanie adresu URL typu http://example.com/products/42zostanie ustawione params[:id]na 42.

hammar
źródło
Jak zdobyć drugi parametr? like / squad / id / member / id / stuff
weteamsteve
48

Params zawiera następujące trzy grupy parametrów:

  1. Parametry dostarczone przez użytkownika
    • POBIERZ (http://domain.com/url?param1=value1¶m2=value2 ustawi parametry [: param1] i parametry [: param2])
    • POST (np. JSON, XML zostanie automatycznie przeanalizowany i zapisany w parametrach)
    • Uwaga: Domyślnie Railsy duplikują parametry dostarczone przez użytkownika i zapisują je w params [: użytkownik], jeśli w UsersController, można je zmienić za pomocą ustawienia wrap_parameters
  2. Parametry routingu
    • match '/user/:id' w route.rb ustawi parametry [: id]
  3. Parametry domyślne
    • params[:controller]i params[:action]jest zawsze dostępny i zawiera bieżący kontroler i działanie
thejaz
źródło
1
Czy mógłbyś rozszerzyć swoją notatkę pod User supplied parametersnieco więcej? Na przykład pomocny byłby przykład skrótu params w UsersController. W twoim przykładzie brzmi to tak, jakby skrót wyglądał mniej więcej tak: {first_name: "mike", user: {first_name: "mike"} ...} Czy to prawda?
7stud
1
Nie widzę tego w rails4. Na przykład {"_method"=>"put", "authenticity_token"=>"gubHya6uQrQLjPRXhOC0RUuCRdn7NFr6CeKrbRfBSHI=", "ripe"=>"true", "action"=>"update", "controller"=>"apples", "id"=>"4"}. Wybacz mi, jeśli się mylę, jestem początkującym torantem. Zgodnie z twoją notatką powinienem zobaczyć: {"_method"=>"put", "authenticity_token"=>"gubHya6uQrQLjPRXhOC0RUuCRdn7NFr6CeKrbRfBSHI=", "ripe"=>"true", "apple" => {"ripe"=>"true"}, "action"=>"update", "controller"=>"apples", "id"=>"4"} nie wiem, czy ma to związek z silnymi parametrami w rails4, czy nie.
7stud
2
Widzę zduplikowane parametry w Rails 4, ale tylko pod żądaniami Json POST (przy użyciu Angularjs), a nie pod własnymi postami HTML Rails. Ten link wyjaśnia, dlaczego: stackoverflow.com/questions/10774972/…
Homan
13

Zasadniczo parametrami są określone przez użytkownika dane do aplikacji szynowej.

Kiedy publikujesz formularz, robisz to ogólnie z żądaniem POST, w przeciwieństwie do żądania GET. Podczas przeglądania witryny możesz myśleć o zwykłych żądaniach szynowych jako o żądaniach GET, jeśli to pomaga.

Po przesłaniu formularza kontrola jest zwracana do aplikacji. Jak uzyskać wartości przesłane do formularza? paramspokazuje.

O twoim kodzie. @vote = Vote.new params[:vote]tworzy nowe Głosowanie w bazie danych na podstawie danych parametrów [: głosowanie]. Biorąc pod uwagę, że przesłany przez Ciebie formularz został nazwany pod nazwą: głosuj, wszystkie jego dane znajdują się w polu: głosowanie skrótu.

Kolejne dwa wiersze służą do pobrania elementu, a użytkownik UID przesłał formularz.

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

znajduje najnowszy lub ostatnio wstawiony głos z bazy danych z warunkami item_id = item i user_id = uid.

Kolejne wiersze zajmują czas ostatniego głosowania i aktualny czas.

Smar
źródło
6

Po stronie Railsów paramsjest to metoda zwracająca ActionController::Parametersobiekt. Zobacz https://stackoverflow.com/a/44070358/5462485

Margotte
źródło
3
+1 za wyjaśnienie, że paramsjest to metoda. Ruby może utrudnić odróżnienie zmiennych od metod
samrap