在常规的Rails 7应用程序中,如果您构建了一个列出Tweets的#index操作,并且希望用户能够内联地编辑这些tweet,您可以这样做:
# _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.html.erb就只能通过Turbo请求访问。
但是,这些编辑请求(不是turbo_stream表单提交)实际上只是一个常规的Processing by TweetsController#edit as HTML请求(它在控制台中打印Processing by TweetsController#edit as HTML),因此这样做:
def edit
respond_to {|format| format.turbo_stream }
end我不能阻止用户直接访问/tweets/1/编辑,因为它不是涡轮流。
在Rails UJS的好日子里,可以很容易地通过限制控制器响应format.js来实现这一点,如下所示:
def edit
respond_to {|format| format.js }
end或者只在视图文件夹中提供一个edit.js.erb文件,因为如果用户直接请求/tweets/1/edit` `(因为它将是一个HTML ),则不会处理HTML请求。
有没有办法用Hotwire & Turbo实现同样的目标?
发布于 2022-03-17 12:58:35
首先,我想问你为什么要限制这一点?turbo的精神,特别是框架和驱动器,是您的应用程序将逐步增强从完整的页面交互(常规的http请求),一直到微交互,如您提到的。您所描述的问题只有在用户使用cmd/ctrl + click打开编辑链接时才会出现。你真的测量过多少人这样做了吗?在一个新的标签里打开它?测量它可能会让你知道限制它是多么的重要。
现在,谈谈你问题的具体内容。
目前(2022年3月)还没有检测到turbo帧请求并对其做出不同响应的方法。您可以跟踪这个问题,并在那里得到一些答案:https://github.com/hotwired/turbo-rails/issues/229
不过,我的直觉是,你想要做的事情与实际情况是背道而驰的,这可能是一种不需要的优化。
发布于 2022-11-19 22:24:13
您可以检查turbo在获取帧内容时提供的turbo帧报头。我正在寻找一种方法来确定这一点,这样我就不必为通过src属性加载到框架中的内容创建一个单独的控制器和视图。

https://stackoverflow.com/questions/70476005
复制相似问题