Как получить доступ к помощнику current_user с помощью Hotwire и Turbo.js?
Я следую этому руководству, чтобы реализовать функцию, с помощью которой пользователь может отправлять викторины / интересные факты.
Я хочу ограничить функциональность (редактировать / удалить) администратором или автором каждого элемента.
Я создал вспомогательный класс в .application_controller
def author_of?(resource)
user_signed_in? && current_user.id == resource.user_id
end
Но когда я использую это в Turbo-frame с Hotwire, я получаю эту ошибку
| ActionView :: Template ::Error (Devise не может найти
Warden::Proxy
экземпляр в вашей среде запроса.
Вот мой код для справки
index.html
<%= turbo_stream_from @stadium, :trivia %>
<%= tag.div id: "#{dom_id(@stadium)}_trivia" do %>
<%= render partial: "trivia/trivium", collection: @stadium.trivia %>
<% end %>
<% end %>
_trivium.html.erb
<%= turbo_frame_tag trivium do %>
<%= trivium.body %>
<% if author_of?(trivium) || admin? %>
<%= button_to "Delete", trivium_path(trivium), class: "btn btn-small btn-danger btn-link mr-2", method: :delete, data: { confirm: "Are you sure?" } %>
<% end %>
<% end %>
Как я могу получить доступ к помощнику current_user в частичном комментарии, чтобы проверить, является ли current_user автором или администратором (и должно быть разрешено удаление / редактирование)?
1 ответ
Причина этих ошибок, как упоминалось здесь , заключается в том , что частичные файлы с турбо-кадрами визуализируются без каких-либо доступных глобальных помощников.
То , что так вопрос указывает на форуме Hotwire здесь , где они обсуждают возможные решения. Самый лучший, на мой взгляд, описан здесь .
Суть такова:
- Передайте current_user в качестве аргумента партиала вместо того, чтобы обращаться к нему изнутри партиала.
- Выполняйте проверку разрешений в частичном, а не во вспомогательном
<%= render partial: "trivia/trivium", collection: @stadium.trivia, user: current_user %>
Вы также можете подумать о том, чтобы превратить свой метод author_of в метод модели, и тогда у вас будет возможность использовать его в своем партиале.