Ruby on Rails Tutorial Запутался в том, как работает хэш Params

Итак, я видел, что другие люди меня смутили по этому поводу, и я читал другие ответы, но я все еще в замешательстве.

Как информация хранится и анализируется в хэше параметров во время запроса на удаление? Я понимаю, как это работает в отношении представления информации. то есть, когда выдается запрос Put, Post или Get, я понимаю, что информация передается через хеш параметров соответствующему действию контроллера.

Однако, основываясь на приведенном ниже коде в частичном пользовательском файле (_user.html.erb):

<li>
    <%= gravatar_for user, size: 52 %>
    <%= link_to user.name, user %>

    <% if current_user.admin? && !current_user?(user) %>
    <%= link_to "delete", user, method: delete,
                            data: {confirm: "You sure?"} %>
                            <% end %>
</li>

И код в действии DESTROY, который автоматически перенаправляется на:

def destroy
  User.find(params[:id]).destroy
  flash[:success] = "User destroyed."
  redirect_to users_url
end

Я не понимаю, как хеш params получает сохраненный в нем идентификатор пользователя. Я бы понял, если бы это были params[:user][:id], поскольку мы публикуем пользователя, у которого есть список атрибутов. Но я не понимаю, как идентификатор сохраняется НАПРЯМУЮ в хеше параметров. Это беспокоило меня какое-то время, поэтому, пожалуйста, любое понимание будет оценено.


person Jake    schedule 01.08.2013    source источник
comment
Джейк, посмотри на html, созданный хелпером link_to(). Кроме того, если вы хотите увидеть, что находится в параметрах, установите pry (pry-full) (очень полезный гем) и вставьте binding.pry в метод уничтожения вашего контроллера, чтобы увидеть, что в конечном итоге будет передано.   -  person ilan berci    schedule 01.08.2013


Ответы (3)


Он основан на модели маршрутизации рельсов.

Если вы использовали ресурсы :user в config/routes.db, он создаст следующий маршрут (вы можете просмотреть его, запустив rake route):

УДАЛИТЬ пользователей/:id

символ :id означает, что все, что вы добавляете после users/ при вызове URL, будет установлено в параметрах как :id. (в случае, для HTTP-глагола DELETE)

person Marc-Alexandre Bérubé    schedule 01.08.2013
comment
тогда вы можете использовать user_path(user), который вернет «users/13», где 13 — это user.id! - person Marc-Alexandre Bérubé; 01.08.2013
comment
Спасибо, парни. Думаю, теперь я понял. Мне нужно начать вырабатывать привычку смотреть на фактический html, сгенерированный моим кодом. Это в сочетании с ответами дало довольно четкую картину происходящего. Еще раз спасибо!! - person Jake; 03.08.2013

Так работают рельсы. Если вы сделаете rake routes, вы увидите, что вы получите что-то вроде DELETE /users/:id.

Это означает, что пользовательский объект, который вы передаете в качестве параметра, интерпретируется как :id. Когда Rails увидит это, он будет знать, что должен посмотреть идентификатор переданного объекта, по соглашению все модели имеют поле идентификатора.

person Christoph Eicke    schedule 01.08.2013

Таким образом, Rails считывает URL-адрес, который вы ему передаете, и затем решает, что с ним делать.

По соглашению он будет думать, что то, что вы ему передаете,

:controller/:id

Итак, что он, вероятно, делает, так это принимает URL-адрес в виде строки и разбивает его в соответствии с символом /.

Попробуйте это в IRB.

controller, id = "hello/1".split("\/")

А затем введите

id

Представьте, что эта вновь установленная переменная id передается в хэш params следующим образом:

params = {}
params[:id] = id

Теперь введите

params[:id]

Правда куда сложнее. Я просматривал источник, чтобы попытаться найти конкретный метод, но происходит слишком много всего. Попробуйте проверить это в ActionDispatch

http://api.rubyonrails.org/classes/ActionDispatch/Routing.html

Удачи!

person ovatsug25    schedule 01.08.2013