Ruby on rails 修改查询url/路径而不重定向
我正试图找到一种方法,在Puma收到我的请求URL之前修改它 例如: 用户使用类似于/locale/resource/:id的url访问站点。 但我希望他被重定向到/locale/'resource/resource slug,因为它更漂亮 我已经做了这个的第一个版本Ruby on rails 修改查询url/路径而不重定向,ruby-on-rails,ruby-on-rails-4,httprequest,puma,Ruby On Rails,Ruby On Rails 4,Httprequest,Puma,我正试图找到一种方法,在Puma收到我的请求URL之前修改它 例如: 用户使用类似于/locale/resource/:id的url访问站点。 但我希望他被重定向到/locale/'resource/resource slug,因为它更漂亮 我已经做了这个的第一个版本 before_action :redirect_with_pretty_challenge_url, only: %w(index show new edit) private def redirect_with_pretty
before_action :redirect_with_pretty_challenge_url, only: %w(index show new edit)
private
def redirect_with_pretty_challenge_url
param_kind = challenge_show_or_admin_challenges? ? :id : :challenge_id
return unless params_is_id?(param_kind)
redirect_to stubbed_request_path_parameters(param_kind)
end
def params_is_id?(param_kind)
return true if params[param_kind].is_a?(Integer)
params[param_kind].to_i.to_s == params[param_kind]
end
def stubbed_request_path_parameters(param_kind)
request.path_parameters[param_kind] = Challenge.find_by_params(params[param_kind])&.slug
request.path_parameters
end
因此,用户被重定向到“正确”的url,但通过重定向
我想知道是否有一种方法可以直接在请求中修改url,这样我就不必将_重定向到用户,这将使这种操作方式更加“透明”
可能吗?或者由于HTTP协议而完全不可能?将
slugUrl
传递给javascript并使用history.replaceState()
:
例如,您可以将
slugUrl
甚至放在模板中,并将slug building登录放在ApplicationController
helper方法中。将slugUrl
传递给javascript并使用history.replaceState()
:
例如,您可以将
slugUrl
甚至放在模板中,并将slug building login放在ApplicationController
helper方法中。您可以更改或apache,但它不会更新浏览器地址栏-Rack/Rails将其视为请求uri。我的意思是,只要学会接受它,你的用户很可能永远不会在乎URL。也许用户不在乎。但我知道。我想控制显示的内容。甚至连网址都没有。我想我会坚持使用一个很好的旧重定向。您可以更改或apache,但它不会更新浏览器地址栏-这正是Rack/Rails所看到的请求uri。我的意思是,只要学会接受它,你的用户很可能永远不会在乎URL。也许用户不在乎。但我知道。我想控制显示的内容。甚至连网址都没有。我想我会坚持一个好的老习惯。
stateObj = history.state # in the case somebody already uses it
stateObj.url = slugUrl # will help with turbolinks and like
history.replaceState stateObj, "", url