Rails Params объяснил?


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
Каков ваш опыт веб-разработки на стороне сервера? Какие технологии вы уже знаете?
Маурисио Линхарес

3
Я был с HTML и CSS в течение многих лет. Взятые классы, которые использовали PHP, JS и Java. Использовал очень мало MVC с PHP, хотя. Я действительно изучил программирование с использованием Java. И я хорошо понимаю теорию баз данных.
Dru

Ответы:


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[item_id]=1&vote[user_id]=2

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

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


13
Эквивалент $ _REQUEST за исключением того, что $ _REQUEST включает в себя данные get, post и cookie, а параметры только получают и публикуют данные.
Парзифаль

3
Данные @renocor POST также включены в paramsхеш Rails . Данные cookie включены в sessionхеш.
Ричард Джонс

Этот ответ исключает еще один источник параметров: URL. Смотрите ответ Hammar для получения дополнительной информации.
Ричард Джонс

1
тостерловин, похоже, вы не прочитали второе предложение моего ответа или не посмотрели первый пример.
Дэвид Грейсон

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

75

Как отмечали другие, paramsзначения могут поступать из строки запроса GET-запроса или данных формы запроса POST, но есть и третье место, откуда они могут исходить: путь URL.

Как вы, возможно, знаете, Rails использует так называемые маршруты для направления запросов к соответствующим действиям контроллера. Эти маршруты могут содержать сегменты, которые извлекаются из URL и помещаются в params. Например, если у вас есть такой маршрут:

match 'products/:id', ...

Тогда запрос к URL , как http://example.com/products/42установит params[:id]в 42.


Как вы получаете второй параметр? как / отряд / id / member / id / stuff
weteamsteve

48

Params содержит следующие три группы параметров:

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

1
Не могли бы вы расширить свою заметку под User supplied parametersнемного больше? Например, полезен пример хэша params в UsersController. Ваш пример показывает, что хеш будет выглядеть примерно так: {first_name: "mike", user: {first_name: "mike"} ...} Это правильно?
7

1
Я не вижу этого в rails4. Так , например, {"_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"} я не знаю, связано ли это с сильными параметрами в rails4 или нет.
7

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

13

В основном, параметры являются указанными пользователем данными для приложения рельсов.

Когда вы публикуете форму, вы обычно делаете это с запросом POST, а не с запросом GET. Вы можете думать, что обычные запросы рельсов как запросы GET, когда вы просматриваете сайт, если это помогает.

Когда вы отправляете форму, элемент управления возвращается в приложение. Как вы получаете значения, которые вы отправили в форму? paramsя показываю.

О вашем коде. @vote = Vote.new params[:vote]создает новый Голосовать в базу данных, используя данные параметров [: голосование]. Учитывая, что ваша отправленная форма была названа под именем: голосование, все данные в ней находятся в этом: поле голосования хеша.

Следующие две строки используются для получения элемента, и пользователь 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.