Как получить доступ к помощнику 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 в метод модели, и тогда у вас будет возможность использовать его в своем партиале.

Другие вопросы по тегам