Понимание части URL link_to, содержащей имя столбца и значение

Пожалуйста, объясните мне часть URL этого link_to.

часть URL

admin_user_path(user,{ user: { admin: !user.admin? } })

полная ссылка_на

<%= link_to "#{ user.admin? }", admin_user_path(user,
  { user: { admin: !user.admin? } }),
  method: :patch,
  class: "admin #{ user.admin ? 'btn-warning' : 'btn-info' } " 
%>

это html

<a class="admin btn-warning " data-method="patch" href="/admin/users/2?
user%5Badmin%5D=false" rel="nofollow">true</a>

admin_user_path генерирует admin/user/

admin_user_path(user) генерирует admin/user/:id

admin_user_path(user, options) Думаете, часть опций содержит значение, доступное в контроллере через параметры? С этим значением я могу сохранить его для записи с идентификатором :id.

Сорри, я все еще новичок в рельсах, и я хочу понять часть опций. я знаю, это магия рельсов, но, может быть, есть немного больше объяснений :)


person AdvanceInBeginning    schedule 02.10.2014    source источник


Ответы (1)


Я проверил руководство по Rails, 2.9 Создание путей и URL-адресов из объектов : "Помимо использования помощников маршрутизации, Rails также может создавать пути и URL-адреса из массива параметров."

Например:

<%= link_to 'Ad details', magazine_ad_path(@magazine, @ad) %>

link_to Документация по API

В твоем случае

admin_user_path(user,{ user: { admin: !user.admin? } })

часть опции создает логическое значение, которое доступно, как вы сказали, в контроллере через параметры. Кроме того, в вашем случае я бы рекомендовал проверить в вашем контроллере, что пользователь на самом деле является администратором, который обращается к этому пути (проверка авторизации).

person jyrkim    schedule 02.10.2014
comment
Спасибо за твой ответ. Страницы администратора (контроллер) имеют before_action: authorize проверку. Этого достаточно или я должен проверить администратора, прежде чем запись будет изменена? На самом деле, я отправил это как пользователь без прав администратора http://localhost:3000/admin/users/1?user%5Badmin%5D=true, и оно не изменилось. повезло мне :) - person AdvanceInBeginning; 02.10.2014
comment
@AdvanceInBeginning, похоже, ваш контроллер работает нормально, если он не обновляется, когда пользователь без прав администратора пытается обновить значение; поэтому я думаю, что у вас уже есть какая-то проверка авторизации с помощью фильтра before_action: authorize. Кроме того, я думаю, что ваш код очень похож на проверку администратора, найденную в учебнике по Ruby on Rails (я имею в виду, что оба контроллера используют фильтр для проверки пользователей-администраторов) railstutorial.org/book/ - person jyrkim; 02.10.2014