在常规的 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,因为它不是涡轮流。
在 Rails UJS 的好日子里,这可以通过限制控制器响应来轻松实现format.js
,如下所示:
def edit
respond_to {|format| format.js }
end
或者只edit.js.erb
在 views 文件夹中提供一个文件,因为如果用户直接请求 /tweets/1/edit (因为这将是一个 HTML 请求),则不会提供 HTML 请求。
有什么方法可以使用 Hotwire 和 Turbo 达到同样的效果?