gpt4 book ai didi

ruby-on-rails - 嵌套或不嵌套资源

转载 作者:行者123 更新时间:2023-12-04 21:46:26 26 4
gpt4 key购买 nike

在过去的几天里,我一直在玩 Rails。

我不确定是否应该嵌套资源,以及如何确定它。

假设我有一个应用程序,用户可以在其中注册并制作待办事项列表。他们可以选择将这些列表设为公开或私有(private)。

我遇到麻烦的地方是我是否应该将列表嵌套在用户资源下:

如果我这样做,我最终会得到类似的结果:
/users/:id/lists/users/:id/lists/:list_id
但是如果我想说,查看 /lists 下的所有公共(public)列表?那会干扰路线的 Restful ,不是吗?

我无法嵌套列表并为用户和列表设置单独的路由,但至少在我看来,我又遇到了麻烦。
/users/:id # some profile page/lists # should this link to all lists or all the current user's lists?
但是,如果我想显示特定用户的列表,我不知道我的路线是什么。

有没有办法以某种方式结合它?将列表嵌套在用户资源下,但仍有 /lists列表路径?或者这只是一个自定义命名路线?

我对那些比我更精通 Rails 的人如何解决这个问题很感兴趣。

最佳答案

您可以同时拥有嵌套列表和非嵌套列表。
resources :lists将创建所有 Restful 路线。

resources :users do
resources :lists
end

然后将创建所有嵌套路由和关联的助手。在这种情况下,我不会使用嵌套路由,因为您的 Controller 将是一个狗屎秀。

嵌套路由(比如 users/7/lists)默认路由到 ListsController#index ,但您也有/lists 将指向 ListsController#index .因此,您可以向 Controller 添加一些逻辑:
ListsController < ApplicationController
def index
if params[:user_id].present?
# I'm in a user_list
else
# I'm in a public list
end
end
end

啊。

好的 before_filter 怎么样?
ListsController < ApplicationController
before_filter :unjankify_nested_routes

private

def unjankify_nested_routes
if params[:user_id].present?
# I'm in a user_list
render "users_#{@action}"
else
# I'm in a public list
end
end
end

现在我们基本上可以通过说 users_show、users_index 等来确定 Controller 方法的范围。但是那个 @action 变量是什么?我们需要捕捉到这一点。
class ApplicationController     
def process_action(name, *args)
@action_name = name
super rescue false #no super in tests
end
end

我们只是重写了一个内部 Rails 方法来捕获 Action 名称。这很有趣,但似乎我们做错了什么。

正确的方式(tm)

没有“正确的方法”,只有 scopes是一个不错的选择
scope 'privates' do
resources :lists
end

现在我们可以有一个 Privates::ListsControllerapp/controllers/privates/lists_controller .您可以在查询参数中添加 user_id,或在范围内嵌套路由:
scope 'privates' do
resources :users do
resources :lists
end
end

关于ruby-on-rails - 嵌套或不嵌套资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13672537/

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