Ruby On Rails - 命名空间资源

Ruby On Rails - Namespacing Resources

提问人:Sidney John Diongzon 提问时间:9/21/2023 最后编辑:Sidney John Diongzon 更新时间:9/22/2023 访问量:61

问:

我在 rails 中的命名空间模型中遇到了问题。 我的应用程序中有这些模型

Request
Food
Clothing
Request::Food
Request::Clothing

我传递了一个命名空间模型,例如作为参数,但该函数仍然调用它应该调用命名空间模型的位置。 我尝试更新命名空间,它有效。Request::FoodFoodRequest::FoodRequests::Food

这件事有什么特别的原因吗?有什么方法可以保留这个命名空间吗?Request::FoodRequest::Clothing

例:

 def authorize(resource)
    policy_object = "#{resource.name}Policy".classify.constantize
 end

authorize(Request::Food)返回而不是FoodPolicyRequestFoodPolicy

Ruby-on-Rails(红宝石轨道)

评论

2赞 Benjamin Scharbau 9/21/2023
您能分享一些例子吗?通常 rails 是动态类型的,所以函数并不真正关心你提供的参数是什么类型
1赞 max 9/21/2023
这可能是问题所在吗?rubystyle.guide/#namespace 定义
0赞 Sidney John Diongzon 9/22/2023
我更新了它@BenjaminScharbau并添加了一个示例。
0赞 Benjamin Scharbau 9/22/2023
这是设计吗?我也明白两者应该在您的数据库中使用相同的表?Request::FoodFood
0赞 Sidney John Diongzon 9/22/2023
@BenjaminScharbau 这不是设计,我正在用我的应用程序实现某种设计模式。是的,继承.Request::FoodFood

答:

0赞 Milind 9/22/2023 #1

在命名模型时,您必须注意以下几件事 -

  1. 您需要明确地将表命名为 will point to but will not point to ,您也必须提及。model btable bmodel a:btable b
  2. 确保你不会错过任何需要的地方的更改,因为现在和现在不同了,最好使用新名称,如 和 。a:b modelmodel bmodel a:bmodel a:bmodel c

所以你的模型应该是这样的——

class Request::Food < ApplicationRecord
  ## this should not be foods
  self.table_name = 'food_requests'

  ## instance method
  def get_food;end

您需要致电Request::Food.first.get_food

要验证这一点,请访问并点击 Request::Food.new 以查看被击中的表是什么。rails console

评论

0赞 Sidney John Diongzon 9/22/2023
事情也应该指向.我只需要为我制作一个命名间隔资源,以具有一个动态函数来访问命名间隔模式,如 等。Request::FoodFoodRequest::Food::CreateServiceRequest::FoodPolicy
0赞 Benjamin Scharbau 9/22/2023
Rails 通常希望将表命名为 。如果由迁移创建,则应自动处理该问题。request_foodsrails generate model Request::Food
0赞 Sidney John Diongzon 9/22/2023
@BenjaminScharbau 我在这里实际做的是继承自Request::FoodFood class Request::Food < Food
0赞 Milind 9/22/2023
如果它是 STI,除非您使用 TYPE,否则它将始终调用食物。希望你能@SidneyJohnDiongzon