Rails params wyjaśnione?

Czy ktoś mógłby wyjaśnić params w Rails controller: skąd pochodzą i do czego się odnoszą?

  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 być w stanie odczytać ten kod linia po linii i zrozumieć, co się dzieje.

Author: tereško, 2011-07-31

5 answers

Paramy pochodzą z przeglądarki użytkownika, gdy żąda strony. W przypadku żądania HTTP GET, które jest najczęstsze, paramy są zakodowane w adresie url. Na przykład, jeśli przeglądarka użytkownika zażądała

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

Wtedy params[:foo] będzie "1 "i params[:boo] będzie "ośmiornica".

W HTTP/HTML, params są tak naprawdę tylko serią par klucz-wartość, gdzie klucz i wartość są ciągami znaków, ale Ruby on Rails ma specjalną składnię dla dokonywanie params być hash z hashami w środku. Na przykład, jeśli przeglądarka użytkownika zażądała

Http://www.example.com/?vote[item_id] = 1 & głosuj[user_id]=2

Wtedy params[:vote] będzie skrótem, params[:vote][:item_id] będzie "1", A params[:vote][:user_id] będzie "2".

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

 254
Author: David Grayson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-11 00:15:08

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

Jak zapewne wiesz, Rails używa czegoś, co nazywa się routes, aby kierować żądania do odpowiednich akcji kontrolera. Trasy te mogą zawierać segmenty, które są wyodrębniane z adresu URL i umieszczane w params. Na przykład, jeśli masz taką trasę:

match 'products/:id', ...

Następnie Prośba o adres URL taki jak {[3] } ustawi params[:id] na 42.

 71
Author: hammar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-30 22:20:20

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

  1. parametry dostarczone przez Użytkownika
  2. Uwaga: Domyślnie Rails duplikuje podane przez użytkownika parametry i przechowuje je w params[:user] jeśli w UsersController, może be changed with wrap_parameters setting
  3. parametry routingu
    • match '/user/:id' w trasach.rb ustawia params [: id]
  4. domyślne parametry
    • params[:controller] i {[2] } jest zawsze dostępne i zawiera bieżący kontroler oraz akcję
 45
Author: thejaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-01 14:55:00

W zasadzie, parametry są danymi podanymi przez użytkownika do aplikacji rails.

Kiedy publikujesz formularz, robisz to zazwyczaj za pomocą żądania POST, a nie żądania GET. Możesz myśleć o zwykłych żądaniach rails jako o żądaniach GET, kiedy przeglądasz witrynę, jeśli to pomoże.

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

O Twoim kodzie. @vote = Vote.new params[:vote] tworzy nowe głosowanie do bazy danych przy użyciu danych z params [: głosuj]. Biorąc pod uwagę, że użytkownik przesłanego formularza został nazwany pod nazwą: vote, wszystkie jego dane znajdują się w polu :vote hasha.

Następne dwie linie są używane do pobierania item i UID użytkownika przesłanego do formularza.

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

Wyszukuje najnowszy lub ostatnio dodany głos z bazy danych o warunkach item_id = item i user_id = uid.

Następna linia zajmuje ostatni czas głosowania i bieżący czas.

 13
Author: Smar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-17 20:34:27

Po stronie Rails, {[0] } jest metodą, która zwraca obiekt ActionController::Parameters. Zobacz https://stackoverflow.com/a/44070358/5462485

 3
Author: Margotte,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-06 15:18:39