如何使用 Hotwire 和 Turbo.js 访问 current_user 助手?

问题描述

我正在关注 this tutorial 以实现用户可以提交琐事/有趣事实的功能

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

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

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

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

| ActionView::Template::Error(设计无法在您的请求环境中找到 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 是作者还是管理员(并且应该允许删除/编辑)?

解决方法

这个错误的原因是,正如前面提到的 here,带有 Turbo 帧的部分在没有任何可用的全局助手的情况下被渲染。

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

要点是:

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...