0

我正在按照本教程实现用户可以提交琐事/有趣事实的功能。

我想将(编辑/删除)功能限制为每个项目的管理员或作者。</p>

我在 .application_controller 中创建了一个辅助类

def author_of?(resource)
user_signed_in? && current_user.id == resource.user_id
end

但是当我在带有 Hotwire 的 Turbo-frame 中使用它时,我收到了这个错误

| ActionView::Template::Error(设计在您的请求环境中找不到Warden::Proxy实例。

这是我的代码供参考

索引.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 是作者还是管理员(并且应该允许删除/编辑)?

4

1 回答 1

0

如此处所述,此错误的原因是,没有任何可用的全局帮助程序的情况下呈现带有 Turbo 帧的部分。

这个 SO 问题指向一个 Hotwire 论坛,他们在这里讨论可能的解决方案。这里描述了我认为最好的一个。

要点是:

  • 将 current_user 作为参数传递给您的部分,而不是从您的部分中访问它
  • 在部分而不是助手中进行权限检查
<%= render partial: "trivia/trivium", collection: @stadium.trivia, user: current_user %>

您也可以考虑将您的 author_of 方法转换为模型方法,然后您可以选择在您的部分中使用它。

于 2021-05-17T20:11:04.397 回答