gpt4 book ai didi

ruby-on-rails - 如何有条件地在 Rails 中包含路由参数?

转载 作者:行者123 更新时间:2023-12-04 07:29:55 25 4
gpt4 key购买 nike

我试图允许一种资源,Site , 有条件地拥有父资源, Organization .

这是我目前拥有的:

resources :site do
resources :posts do
resources :comments
end
end

这导致路径像
/sites/1
/sites/1/edit
/sites/1/posts
/sites/1/posts/123/comments
# etc. etc.

我希望能够拥有类似的路径
/parent_id/sites/1
/parent_id/sites/1/edit
/parent_id/sites/1/posts
/parent_id/sites/1/posts/123/comments

但前提是该站点属于一个组织。

我也不想更改我网站上已经使用的每个路径助手(实际上有数百个地方)。

这可能吗?

这是我尝试过的:
scope "(:organization_id)/", defaults: { organization_id: nil } do
resources :site
end

# ...

# in application_controller.rb
def default_url_options(options = {})
options.merge(organization_id: @site.organization_id) if @site&.organization_id
end

但这没有用。 organization_id没有准备好。
# in my views
link_to "My Site", site_path(site)
# results in /sites/1 instead of /321/sites/1

我还尝试在路由约束中设置 organization_id,但效果不佳。

最佳答案

将另一个块添加到您的 route ,其中包含公司资源:

resources :companies do
resources :site do
resources :posts do
resources :comments
end
end
end

resources :site do
resources :posts do
resources :comments
end
end

现在您可以为您的链接创建一个帮助程序,如下所示:

# sites_helper.rb
module SitesHelper
def link_to_site(text, site)
if site.company
link_to text, company_site_path(site.company, site)
else
link_to text, site_path(site)
end
end
end

然后在您的 View 中使用它,如下所示:

<%= link_to_site("Text of the link", variable_name) %>

注意 variable_name在论据中。它可以是 site 或 @site,具体取决于您的代码。在循环中,它可能是站点,但在显示页面上,我猜它会是 @site。

关于ruby-on-rails - 如何有条件地在 Rails 中包含路由参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57271888/

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