从 Rails 中的 Turbo Frame 中查找当前 URL 或 "main" 控制器
Finding the current URL or "main" controller from within a Turbo Frame in Rails
我的页面上有一个 Turbo Frame,它使用 src
属性在 /chats/
中加载。在此框架内,我想知道 main 页面是否正在使用 groups
控制器的 show
操作,即 URL该页面位于 /groups/group_name
.
Using current_page?(controller: 'groups', action: 'show')
returns false 因为它认为自己在 chats
控制器中。我该如何解决这个问题?
以下是我找到的选项:
request.referrer
似乎没有以您描述的方式获取控制器 class / 操作的内置方式,但您可以访问 URL通过 request.referrer
发起 Turbo 请求 (groups_controller#show) 的页面。这将是页面的完全限定 URL,例如 http://localhost:3000/groups/1/show
.
- 使用查询参数
这需要更改查看代码(您必须向需要此功能的所有链接添加查询参数),但它允许您传递 controller/action 名称和您想要的任何其他任意数据。
示例:
在application_controller.rb中:
# define a method to capture the information you wish to access during your Turbo stream request
def current_route_info
{
path: current_path,
controller: params[:controller],
action: params[:action]
}
end
在此示例中无需触摸组控制器。
在show.html.erb(提交Turbo请求的页面)
<%= form_with url: turbo_view_path(info: current_route_info) do %>
...
<% end %>
OR
<%= link_to turbo_view_path(info: current_route_info) do %>
...
<% end %>
OR
<!-- you could also manually build the URL & encode the query params if you need to avoid URL helpers-->
<turbo-frame id="" src=chats_partial_path(info: current_route_info)>
...
<turbo-frame>
聊天部分控制器(处理 Turbo 请求)
def turbo_view_method
params[:info]
# => info as defined in current_route_info
end
- 使用
flash
我刚刚了解了使用 flash
实现跨请求扩展的此类功能的多种方法。这比使用查询参数的工作少,主要是因为您不需要调整您的视图代码。
示例:
组控制器(渲染显示视图,提交 Turbo 请求)
def show
# stick the current controller and action params into flash
# again, you can add any other arbitrary (primitive) data you'd like
flash[:referrer] = params.slice(:controller, :action)
...
...
end
聊天部分控制器(处理 Turbo 请求)
def chats_turbo_method
flash[:referrer]
# => { controller: "some_controller", action: "show" }
# NOTE: flash will retain this :referrer key for exactly 1 further request.
# If you require this info for multiple Turbo requests,
# you must add:
flash.keep(:referrer)
# and you will have access to flash[:referrer] for as many Turbo requests as you want to make from group#show
end
我的页面上有一个 Turbo Frame,它使用 src
属性在 /chats/
中加载。在此框架内,我想知道 main 页面是否正在使用 groups
控制器的 show
操作,即 URL该页面位于 /groups/group_name
.
Using current_page?(controller: 'groups', action: 'show')
returns false 因为它认为自己在 chats
控制器中。我该如何解决这个问题?
以下是我找到的选项:
request.referrer
似乎没有以您描述的方式获取控制器 class / 操作的内置方式,但您可以访问 URL通过 request.referrer
发起 Turbo 请求 (groups_controller#show) 的页面。这将是页面的完全限定 URL,例如 http://localhost:3000/groups/1/show
.
- 使用查询参数
这需要更改查看代码(您必须向需要此功能的所有链接添加查询参数),但它允许您传递 controller/action 名称和您想要的任何其他任意数据。
示例:
在application_controller.rb中:
# define a method to capture the information you wish to access during your Turbo stream request
def current_route_info
{
path: current_path,
controller: params[:controller],
action: params[:action]
}
end
在此示例中无需触摸组控制器。
在show.html.erb(提交Turbo请求的页面)
<%= form_with url: turbo_view_path(info: current_route_info) do %>
...
<% end %>
OR
<%= link_to turbo_view_path(info: current_route_info) do %>
...
<% end %>
OR
<!-- you could also manually build the URL & encode the query params if you need to avoid URL helpers-->
<turbo-frame id="" src=chats_partial_path(info: current_route_info)>
...
<turbo-frame>
聊天部分控制器(处理 Turbo 请求)
def turbo_view_method
params[:info]
# => info as defined in current_route_info
end
- 使用
flash
我刚刚了解了使用 flash
实现跨请求扩展的此类功能的多种方法。这比使用查询参数的工作少,主要是因为您不需要调整您的视图代码。
示例:
组控制器(渲染显示视图,提交 Turbo 请求)
def show
# stick the current controller and action params into flash
# again, you can add any other arbitrary (primitive) data you'd like
flash[:referrer] = params.slice(:controller, :action)
...
...
end
聊天部分控制器(处理 Turbo 请求)
def chats_turbo_method
flash[:referrer]
# => { controller: "some_controller", action: "show" }
# NOTE: flash will retain this :referrer key for exactly 1 further request.
# If you require this info for multiple Turbo requests,
# you must add:
flash.keep(:referrer)
# and you will have access to flash[:referrer] for as many Turbo requests as you want to make from group#show
end