问题描述
我正在关注 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 方法转换为模型方法,然后您可以选择在您的部分中使用它。