Изменены параметры Rails?
Может ли кто-нибудь объяснить 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
Я хотел бы иметь возможность читать этот код по очереди и понимать, что происходит.
Ответы
Ответ 1
Параметры поступают из браузера пользователя, когда они запрашивают страницу. Для HTTP GET-запроса, который является наиболее распространенным, параметры кодируются в URL-адресе. Например, если пользовательский браузер запросил
http://www.example.com/?foo=1&boo=octopus
тогда params[:foo]
будет "1", а params[:boo]
будет "осьминог".
В HTTP/HTML параметры действительно представляют собой серию пар ключ-значение, где ключ и значение являются строками, но Ruby on Rails имеет особый синтаксис для того, чтобы заставить params быть хэшем с хэшами внутри. Например, если пользовательский браузер запросил
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.
Ответ 2
Как отмечали другие, значения params
могут исходить из строки запроса запроса GET или данных формы запроса POST, но есть и третье место, из которого они могут исходить: путь к URL.
Как вы, возможно, знаете, Rails использует что-то, называемое маршрутами, для прямого запроса на соответствующие действия контроллера. Эти маршруты могут содержать сегменты, которые извлекаются из URL-адреса и помещаются в params
. Например, если у вас есть такой маршрут:
match 'products/:id', ...
Затем запрос к URL-адресу, подобному http://example.com/products/42
, установит params[:id]
в 42
.
Ответ 3
Парамы содержат следующие три группы параметров:
- Пользовательские параметры
- GET ( http://domain.com/url?param1=value1¶m2=value2 будет устанавливать параметры [: param1] и params [: param2])
- POST (например, JSON, XML будет автоматически анализироваться и храниться в параметрах)
- Примечание. По умолчанию Rails дублирует предоставленные пользователем параметры и сохраняет их в параметрах [: user], если в UserController, можно изменить с помощью параметра wrap_parameters
- Параметры маршрутизации
-
match '/user/:id'
в routes.rb будут установлены параметры [: id]
- Параметры по умолчанию
-
params[:controller]
и params[:action]
всегда доступны и содержат текущий контроллер и действие
Ответ 4
В принципе, параметры являются данными, указанными пользователем, для приложения rails.
Когда вы отправляете форму, вы делаете это обычно с запросом POST, а не с запросом GET. Вы можете думать, что обычные запросы на рельсы являются запросами GET, когда вы просматриваете сайт, если это помогает.
Когда вы отправляете форму, элемент управления возвращается в приложение. Как вы получаете значения, которые вы отправили в форму? params
как.
О вашем коде. @vote = Vote.new params[:vote]
создает новое голосование в базе данных с использованием данных параметров [: vote]. Учитывая, что ваша форма, представленная пользователем, была названа по имени: vote, все данные в ней: поле голосования хэша.
Следующие две строки используются, чтобы получить элемент и пользователь uid отправил в форму.
@extant = Vote.find(:last, :conditions => ["item_id = ? AND user_id = ?", item, uid])
находит новый или последний вставленный голос из базы данных с условиями item_id = item и user_id = uid.
Следующие строки занимают время последнего и текущего времени.
Ответ 5
На стороне Rails params
- это метод, возвращающий объект ActionController::Parameters
.
См. fooobar.com/info/32040/...