【发布时间】: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