1

在常规的 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 达到同样的效果?

4

0 回答 0