在一个常规的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有什么方法可以达到同样的效果吗?
2条答案
按热度按时间xdnvmnnf1#
首先,我想问你为什么要限制这一点?涡轮增压的精神,特别是框架和驱动,是让您的应用程序从整页交互逐步增强(常规的http请求)一直到你提到的微交互。你描述的问题只有在你的用户使用cmd/ctrl + click打开编辑链接时才会出现。你有没有实际测量过有多少人这样做?比如,在一个新的标签页中打开它?测量一下可能会让你知道限制它有多重要。
现在,谈谈你的问题的细节。
目前(2022年3月)还没有一种方法来检测turbo帧请求并对其做出不同的响应。你可以关注这个问题,也许会得到一些答案:https://github.com/hotwired/turbo-rails/issues/229
我的直觉是,你想做的事情有点违背常理,这可能是一个优化,并不是真的需要。
rkue9o1l2#
你可以检查Turbo在获取帧内容时提供的Turbo-Frame头。我一直在寻找一种方法来确定这一点,这样我就不需要为通过src属性加载到帧中的内容创建单独的控制器和视图。