【问题标题】:Rails & Turbo/Hotwire: Prevent user from accessing the view directlyRails & Turbo/Hotwire:防止用户直接访问视图
【发布时间】:2021-12-24 19:23:27
【问题描述】:

在常规 Rails 7 应用程序中,如果您构建一个列出推文的 #index 操作,并且您希望用户能够内联编辑推文,您可以执行以下操作:

# _tweet.html.erb
<%= turbo_frame_tag(tweet) do %>
  <%= tweet.text %>
  <%= link_to "Edit this tweet", edit_tweet_path(tweet) %>
<% end %>

然后在tweets/edit.html.erb:

<%= turbo_frame_tag(tweet) do %>
  <%= render "form", tweet: @tweet %>
<% end %>

即使很难,我也想阻止用户直接点击 URL /tweets/1/edit,这样edit.html.erb 只能通过 Turbo 帧请求访问。

但是,这些编辑请求(不是 turbo_stream 表单提交)实际上只是一个常规的 HTML 请求(它在控制台中打印Processing by TweetsController#edit as HTML),所以通过这样做:

def edit
  respond_to {|format| format.turbo_stream }
end

我无法阻止用户直接访问 /tweets/1/edit,因为它不是 Turbo 流。

在 Rails UJS 的好日子里,这可以通过限制控制器响应 format.js 来轻松实现,如下所示:

def edit
  respond_to {|format| format.js }
end

或者只在 views 文件夹中提供一个 edit.js.erb 文件,因为如果用户直接请求 /tweets/1/edit (因为这将是一个 HTML 请求),则不会提供 HTML 请求。

有什么方法可以使用 Hotwire 和 Turbo 达到同样的效果?

【问题讨论】:

    标签: ruby-on-rails hotwire-rails


    【解决方案1】:

    首先,我想问你为什么要限制这个? turbo 的精神,特别是框架和驱动,是为了让您的应用程序从整页交互(常规 http 请求)一直到像您提到的那样的微交互逐渐增强。 只有当您的用户使用 cmd/ctrl + click 打开编辑链接时,您所描述的问题才会出现。你真的测量过有多少人这样做吗?比如,在新标签页中打开它?衡量它可能会让您了解限制它的重要性。

    现在,关于您的问题的具体细节。

    目前(2022 年 3 月)没有一种方法可以检测 turbo 帧请求并对其做出不同的响应。你可以关注这个问题,也许在那里得到一些答案: https://github.com/hotwired/turbo-rails/issues/229

    但我的直觉是,您正在考虑做的事情有点违背常规,而且它可能是一种并不真正需要的优化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 2012-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多