gpt4 book ai didi

ruby-on-rails-3 - Rails 3 的内部重定向

转载 作者:行者123 更新时间:2023-12-04 02:28:34 25 4
gpt4 key购买 nike

我正在尝试在 Rails 3 中实现一个通用的虚 url 系统。从虚 url 不绑定(bind)到特定模型的意义上说是通用的。它类似于我拥有 VanityUrlController 的 Vanities gem。这是从所有虚荣网址中获得的。不同之处在于我不想从 foo.com/username 进行外部重定向至foo.com/users/1foo.com/product-namefoo.com/products/1 .我希望虚荣 url 保持不变,并让 VanityUrlContoller 进行内部重定向,以模仿相应的表演 Action 。

我知道要将内部重定向发送到哪个 Controller 和操作,但我在实际发送它时遇到了问题。这就是我现在的位置:

TargetController.new.process("show", request.env)

它似乎开始处理新的“请求”,但缺少关键部分……比如实际的请求对象。

任何想法或指示将不胜感激。

更新:

我在 ActionController 中遇到了 dispatch 方法,这似乎让我走得更远。
TargetController.new.dispatch("show", request)

我有两个问题,1)它被列为私有(private) api 方法,所以如果有另一种方法可以做到这一点,我宁愿那样,2)即使它正在为 TargetController 呈现显示模板,它是提示“缺少模板 vanity_urls/show”。

更新

这是我们提出的解决方案的基础知识。我们做了一些其他的事情,比如强制编码和检查其他一些特定于应用程序的东西,但这应该是你开始所需要的。

这位于您的 routes.rb 的最底部文件,这样您的虚荣路线就不会破坏您的其他命名路线。
# Vanity routes.
match ':id', :as => 'vanity', :to => proc { |env|
id = env["action_dispatch.request.path_parameters"][:id]

vain_object = <method to find the object you want to display>
if vain_object.nil?
# render your 404 page
'application#404'
else
model = vain_object.class.model_name
# figure out the controller you want to go to
controller = [model.pluralize.camelize,"Controller"].join.constantize
# reset the :id parameter with the id of the object to be displayed
env["action_dispatch.request.path_parameters"][:id] = vain_object.id
# do your internal redirect
controller.action("show").call(env)
end
}

在创建虚荣路线时,您还需要小心,以免它们与您的其他 Controller 发生冲突。其他一些有用的信息是:
Rails.application.routes.routes.any? { |r| r.requirements[:controller] == vanity_url }

这会告诉您您的 vanity_url与当前 Controller 同名。
Rails.application.routes.recognize_path("/#{vanity_url}", :method => :get)

它告诉你这是否已经映射到任何东西。

当然,沿途有一些技巧,但它就像一个魅力。

最佳答案

试试 FriendlyId 插件。它似乎完全符合您的要求。视频教程:
http://railscasts.com/episodes/314-pretty-urls-with-friendlyid

关于ruby-on-rails-3 - Rails 3 的内部重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4996685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com