Параметри рейки пояснили?


228

Чи може хтось пояснити paramsв контролері Rails: звідки вони беруться і на що вони посилаються?

  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

Я хотів би мати можливість прочитати цей код по черзі та зрозуміти, що відбувається.


2
Який фон у розробці веб-сторінок? Які технології ви вже знаєте?
Maurício Linhares

3
Я працював з HTML і CSS роками. Взяли класи, які використовували PHP, JS та Java. Хоча використовується дуже мало MVC з php. Я дійсно навчився програмуванню за допомогою Java. І я досконало розумію теорію баз даних.
Друга

Відповіді:


281

Парами надходять із браузера користувача, коли він запитує сторінку. Для HTTP GET-запиту, який є найпоширенішим, парами кодуються в URL-адресі. Наприклад, якщо просив браузер користувача

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

тоді params[:foo]було б "1" і params[:boo]було б "восьминога".

У HTTP / HTML парами справді є лише рядом пар ключових значень, де ключ і значення - це рядки, але Ruby on Rails має спеціальний синтаксис для того, щоб парами були хешами з хешами всередині. Наприклад, якщо браузер користувача запитував

http://www.example.com/?vote evidenceitem_idškar=1&vote evidenceuser_idškar=2

тоді params[:vote]було б хеш, params[:vote][:item_id]було б "1" і params[:vote][:user_id]було б "2".

Параметри Ruby on Rails - еквівалент масиву $ _REQUEST в PHP .


13
Еквівалентно $ _REQUEST, за винятком того, що $ _REQUEST включає дані отримання, публікації та файлів cookie, в той час як парами лише отримують та розміщують дані.
Парцифал

3
Дані POST @renocor також містяться в paramsхеші Rails . Дані файлів cookie включаються в sessionхеш.
Річард Джонс

Ця відповідь залишає ще одне джерело парам: URL. Див. Відповідь hammar для отримання додаткової інформації.
Річард Джонс

1
тостерловін, здається, ви не прочитали другого речення моєї відповіді чи не подивилися перший приклад.
Девід Грейсон

1
@AnkitDhingra ... Я думаю, що це завжди буде рядком, оскільки параметри HTTP - це дійсно лише пара ключів / значень, а Rails (швидше за все, Rack gem) аналізує хеши та масиви відповідно до ключового значення, але я нічого подібного не бачив що повідомляє Rails, що значення - це число.
rubyprince

75

Як зазначали інші, paramsзначення можуть надходити з рядка запиту GET-запиту або даних форми запиту POST, але є й третє місце, з якого вони можуть бути: Шлях URL-адреси.

Як ви можете знати, Rails використовує так звані маршрути, щоб направляти запити на відповідні дії контролера. Ці маршрути можуть містити сегменти, які витягуються з URL-адреси та вводяться в них params. Наприклад, якщо у вас такий маршрут:

match 'products/:id', ...

Тоді запит до такої URL-адреси http://example.com/products/42буде встановлено params[:id]на 42.


Як ви отримуєте другий парам? подобається / squad / id / member / id / stuff
weteamsteve

48

Парами містять такі три групи параметрів:

  1. Параметри, що надаються користувачем
    • Отримати (http://domain.com/url?param1=value1¶m2=value2 встановить парами [: param1] та params [: param2])
    • POST (наприклад, JSON, XML автоматично буде розбиратися і зберігатися в парамах)
    • Примітка. За замовчуванням Rails дублює надані користувачем параметри і зберігає їх у парамах [: user], якщо в UsersController можна змінити за допомогою параметра wrap_parameters
  2. Параметри маршрутизації
    • match '/user/:id' у route.rb встановить парами [: id]
  3. Параметри за замовчуванням
    • params[:controller]і params[:action]завжди доступний і містить поточний контролер та дію

1
Чи можете ви розширити свою примітку User supplied parametersще трохи? Наприклад, корисним буде приклад хему парам в UsersController. У вашому прикладі звучить так, що хеш виглядатиме приблизно так: {first_name: "mike", user: {first_name: "mike"} ...} Це правильно?
7stud

1
Я цього не бачу в рейках4. Так , наприклад, {"_method"=>"put", "authenticity_token"=>"gubHya6uQrQLjPRXhOC0RUuCRdn7NFr6CeKrbRfBSHI=", "ripe"=>"true", "action"=>"update", "controller"=>"apples", "id"=>"4"}. Пробачте, якщо я помиляюся, я початківець з рейок. Відповідно до вашої записки, я повинен бачити: {"_method"=>"put", "authenticity_token"=>"gubHya6uQrQLjPRXhOC0RUuCRdn7NFr6CeKrbRfBSHI=", "ripe"=>"true", "apple" => {"ripe"=>"true"}, "action"=>"update", "controller"=>"apples", "id"=>"4"} я не знаю, чи це стосується сильних параметрів в рейках4 чи ні.
7stud

2
Я бачу дублюються парами в Rails 4, але тільки під json POST-запитами (використовуючи Angularjs), а не під власними HTML-повідомленнями Rails. Це посилання пояснює, чому: stackoverflow.com/questions/10774972/…
Homan

13

В основному параметри - це дані, визначені користувачем, для програми рейки.

Коли ви публікуєте форму, ви зазвичай робите це з запитом POST на відміну від GET-запиту. Ви можете вважати звичайні запити на рейли як запити GET під час перегляду сайту, якщо це допомагає.

Коли ви подаєте форму, контроль повертається до програми. Як ви отримуєте значення, які ви подали у форму? paramsя показую.

Про свій код. @vote = Vote.new params[:vote]створює нову базу даних Голосування за допомогою даних парам [: voice]. З огляду на те, що подана вами форма користувачу була названа під назвою: голосуйте, всі дані про неї знаходяться в цьому: поле голосування хеша.

Наступні два рядки використовуються для отримання елемента, а користувач uid надіслав форму.

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

знаходить останнє або останнє вставлене голосування з бази даних з умовами item_id = item та user_id = uid.

Наступний рядок займає останній час голосування та поточний час.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.