Ruby on rails Rails 5:事件系统

Ruby on rails Rails 5:事件系统,ruby-on-rails,ruby,ruby-on-rails-5,associations,Ruby On Rails,Ruby,Ruby On Rails 5,Associations,我正在制作一个事件系统。我有一个模型事件,每个事件都有文件、报告、提供者等等 以下是我今天的路线: scope 'app', :module => "app" do resources :events, :roteiros, :convidados, :lista_convidados, :orcamentos, :orcamento_items, :providers, :provider

我正在制作一个事件系统。我有一个模型事件,每个事件都有文件、报告、提供者等等

以下是我今天的路线:

  scope 'app', :module => "app" do
    resources :events, :roteiros, 
              :convidados, :lista_convidados,
              :orcamentos, :orcamento_items, :providers, 
              :providers_items, :reports, :reports_items,
              :modelos, :modelos_items, :arquivos, :arquivos_items   
    end
我正在寻找其他模型的最佳方式,当编辑或创建新数据时,新信息与事件模型关联,然后每个事件都将有与之关联的信息

我认为应该是这样的:

scope 'app', :module => "app" do
    resources :events do

              :roteiros, 
              :convidados, :lista_convidados,
              :orcamentos, :orcamento_items, :providers, 
              :providers_items, :reports, :reports_items,
              :modelos, :modelos_items, :arquivos, :arquivos_items

    end
end
然后url看起来像
/app/events/event name/providers

我仍然需要获取事件id,以便将新记录与特定事件关联

所有模型都已具有要关联的
事件id

谢谢你的帮助

更新

现时路线:

控制器

局部的

看法


卡斯托埃斯蒂马多酒店 R$0,00 卡斯托雷亚尔酒店 R$0,00 勇敢的帕戈 R$0,00 彭登特客栈 R$0,00 描述 卡斯托埃斯蒂马多酒店 卡斯托雷亚尔酒店 勇敢的帕戈 潘登特勇气酒店 普罗西莫·文西门托 雷亚尔美元 雷亚尔美元 雷亚尔美元 雷亚尔美元 {:controller=>“orcamento_items”,:action=>“create”},:html=>{:method=>:post}do | f |%> 小计 R$0.000 R$0.000 R$0.000 R$0.000
奥拉门托酒店 诺梅达利斯塔酒店 阿迪西奥纳尔·奥拉门托 任务%>

首先,您需要在嵌套项前面放置
资源。比如:

scope 'app', :module => "app" do
  resources :events do
    resources :roteiros, 
              :convidados, :lista_convidados,
              :orcamentos, :orcamento_items, :providers, 
              :providers_items, :reports, :reports_items,
              :modelos, :modelos_items, :arquivos, :arquivos_items
  end
end
resources :events do
  resources :arquivos, 
            :arquivos_items,
            :convidados, 
            :lista_convidados,
            :modelos, 
            :modelos_items, 
            :orcamento_items, 
            :orcamentos, 
            :providers, 
            :providers_items, 
            :reports, 
            :reports_items,
            :roteiros, 
            shallow: true
end
当您在控制台中运行
rake routes
时,它将为您提供如下信息:

    event_roteiros GET    /app/events/:event_id/roteiros(.:format)              app/roteiros#index
                   POST   /app/events/:event_id/roteiros(.:format)              app/roteiros#create
 new_event_roteiro GET    /app/events/:event_id/roteiros/new(.:format)          app/roteiros#new
edit_event_roteiro GET    /app/events/:event_id/roteiros/:id/edit(.:format)     app/roteiros#edit
     event_roteiro GET    /app/events/:event_id/roteiros/:id(.:format)          app/roteiros#show
                   PATCH  /app/events/:event_id/roteiros/:id(.:format)          app/roteiros#update
                   PUT    /app/events/:event_id/roteiros/:id(.:format)          app/roteiros#update
                   DELETE /app/events/:event_id/roteiros/:id(.:format)          app/roteiros#destroy

                   ... omitting a bunch of routes ...

            events GET    /app/events(.:format)                                 app/events#index
                   POST   /app/events(.:format)                                 app/events#create
         new_event GET    /app/events/new(.:format)                             app/events#new
        edit_event GET    /app/events/:id/edit(.:format)                        app/events#edit
             event GET    /app/events/:id(.:format)                             app/events#show
                   PATCH  /app/events/:id(.:format)                             app/events#update
                   PUT    /app/events/:id(.:format)                             app/events#update
                   DELETE /app/events/:id(.:format)                             app/events#destroy
    event_arquivos GET    /events/:event_id/arquivos(.:format)              arquivos#index
                   POST   /events/:event_id/arquivos(.:format)              arquivos#create
 new_event_arquivo GET    /events/:event_id/arquivos/new(.:format)          arquivos#new
      edit_arquivo GET    /arquivos/:id/edit(.:format)                      arquivos#edit
           arquivo GET    /arquivos/:id(.:format)                           arquivos#show
                   PATCH  /arquivos/:id(.:format)                           arquivos#update
                   PUT    /arquivos/:id(.:format)                           arquivos#update
                   DELETE /arquivos/:id(.:format)                           arquivos#destroy

                   ... omitting a bunch of routes ...

            events GET    /events(.:format)                                 events#index
                   POST   /events(.:format)                                 events#create
         new_event GET    /events/new(.:format)                             events#new
        edit_event GET    /events/:id/edit(.:format)                        events#edit
             event GET    /events/:id(.:format)                             events#show
                   PATCH  /events/:id(.:format)                             events#update
                   PUT    /events/:id(.:format)                             events#update
                   DELETE /events/:id(.:format)                             events#destroy
如您所见,这将导致所有内容都在
app
下命名。这意味着您的控制器需要如下所示:

class App::RoteirosController < ApplicationController 
  ...
end
我猜你不会想要的。因此,它应该更像:

resources :events do
  resources :roteiros, 
            :convidados, :lista_convidados,
            :orcamentos, :orcamento_items, :providers, 
            :providers_items, :reports, :reports_items,
            :modelos, :modelos_items, :arquivos, :arquivos_items
end

正如上面所讨论的,你可以考虑做一些类似的事情:

scope 'app', :module => "app" do
  resources :events do
    resources :roteiros, 
              :convidados, :lista_convidados,
              :orcamentos, :orcamento_items, :providers, 
              :providers_items, :reports, :reports_items,
              :modelos, :modelos_items, :arquivos, :arquivos_items
  end
end
resources :events do
  resources :arquivos, 
            :arquivos_items,
            :convidados, 
            :lista_convidados,
            :modelos, 
            :modelos_items, 
            :orcamento_items, 
            :orcamentos, 
            :providers, 
            :providers_items, 
            :reports, 
            :reports_items,
            :roteiros, 
            shallow: true
end
在这种情况下,您将得到如下结果:

    event_roteiros GET    /app/events/:event_id/roteiros(.:format)              app/roteiros#index
                   POST   /app/events/:event_id/roteiros(.:format)              app/roteiros#create
 new_event_roteiro GET    /app/events/:event_id/roteiros/new(.:format)          app/roteiros#new
edit_event_roteiro GET    /app/events/:event_id/roteiros/:id/edit(.:format)     app/roteiros#edit
     event_roteiro GET    /app/events/:event_id/roteiros/:id(.:format)          app/roteiros#show
                   PATCH  /app/events/:event_id/roteiros/:id(.:format)          app/roteiros#update
                   PUT    /app/events/:event_id/roteiros/:id(.:format)          app/roteiros#update
                   DELETE /app/events/:event_id/roteiros/:id(.:format)          app/roteiros#destroy

                   ... omitting a bunch of routes ...

            events GET    /app/events(.:format)                                 app/events#index
                   POST   /app/events(.:format)                                 app/events#create
         new_event GET    /app/events/new(.:format)                             app/events#new
        edit_event GET    /app/events/:id/edit(.:format)                        app/events#edit
             event GET    /app/events/:id(.:format)                             app/events#show
                   PATCH  /app/events/:id(.:format)                             app/events#update
                   PUT    /app/events/:id(.:format)                             app/events#update
                   DELETE /app/events/:id(.:format)                             app/events#destroy
    event_arquivos GET    /events/:event_id/arquivos(.:format)              arquivos#index
                   POST   /events/:event_id/arquivos(.:format)              arquivos#create
 new_event_arquivo GET    /events/:event_id/arquivos/new(.:format)          arquivos#new
      edit_arquivo GET    /arquivos/:id/edit(.:format)                      arquivos#edit
           arquivo GET    /arquivos/:id(.:format)                           arquivos#show
                   PATCH  /arquivos/:id(.:format)                           arquivos#update
                   PUT    /arquivos/:id(.:format)                           arquivos#update
                   DELETE /arquivos/:id(.:format)                           arquivos#destroy

                   ... omitting a bunch of routes ...

            events GET    /events(.:format)                                 events#index
                   POST   /events(.:format)                                 events#create
         new_event GET    /events/new(.:format)                             events#new
        edit_event GET    /events/:id/edit(.:format)                        events#edit
             event GET    /events/:id(.:format)                             events#show
                   PATCH  /events/:id(.:format)                             events#update
                   PUT    /events/:id(.:format)                             events#update
                   DELETE /events/:id(.:format)                             events#destroy
但是,根据您的示例,您似乎希望使用
:event\u name
作为标识符,而不是
:event\u id
。在这种情况下,您将执行以下操作:

resources :events, param: :name do
  resources :arquivos, 
            :arquivos_items,
            :convidados, 
            :lista_convidados,
            :modelos, 
            :modelos_items, 
            :orcamento_items, 
            :orcamentos, 
            :providers, 
            :providers_items, 
            :reports, 
            :reports_items,
            :roteiros, 
            shallow: true
end
这将给你:

    event_arquivos GET    /events/:event_name/arquivos(.:format)            arquivos#index
                   POST   /events/:event_name/arquivos(.:format)            arquivos#create
 new_event_arquivo GET    /events/:event_name/arquivos/new(.:format)        arquivos#new
      edit_arquivo GET    /arquivos/:id/edit(.:format)                      arquivos#edit
           arquivo GET    /arquivos/:id(.:format)                           arquivos#show
                   PATCH  /arquivos/:id(.:format)                           arquivos#update
                   PUT    /arquivos/:id(.:format)                           arquivos#update
                   DELETE /arquivos/:id(.:format)                           arquivos#destroy

                   ... omitting a bunch of routes ...

            events GET    /events(.:format)                                 events#index
                   POST   /events(.:format)                                 events#create
         new_event GET    /events/new(.:format)                             events#new
        edit_event GET    /events/:name/edit(.:format)                      events#edit
             event GET    /events/:name(.:format)                           events#show
                   PATCH  /events/:name(.:format)                           events#update
                   PUT    /events/:name(.:format)                           events#update
                   DELETE /events/:name(.:format)                           events#destroy

我想这就是你要找的。

你好。非常感谢你的帮助。正如你所说,路线是如何运作的。但是当添加到项目的链接时,键入event_orcamentos_url我会得到错误:没有路由匹配{:action=>“index”,:controller=>“app/orcamentos”,:id=>“teste de evento”},缺少必需的键:[:event_id]。我应该更改控制器中的某些内容以获取事件的id吗?我的控制器只获取特定项的id,如def set_orcamento@orcamento=orcamento.find(params[:id])endI尝试使用event_orcamentos_url(@event),但当我转到link时,我没有得到任何路由匹配{:action=>“index”,:controller=>“app/orcamentos”,:event\u id=>nil},路径中缺少必需的键:[:event\u id]:您可能应该使用
event\u orcamentos\u路径(@event)
。然后,您需要确保在控制器操作中设置了
@event
实例。看起来您可能没有设置
@event
,这就是您获得
:event\u id=>nil
的原因。此外,您还需要决定是使用
:id
还是
:name
作为标识符。如您所见这里:
没有与之匹配的路由{:action=>“index”,:controller=>“app/orcamentos”,:id=>“teste de evento”}
,看起来您试图使用
名称
作为
id
resources :events, param: :name do
  resources :arquivos, 
            :arquivos_items,
            :convidados, 
            :lista_convidados,
            :modelos, 
            :modelos_items, 
            :orcamento_items, 
            :orcamentos, 
            :providers, 
            :providers_items, 
            :reports, 
            :reports_items,
            :roteiros, 
            shallow: true
end
    event_arquivos GET    /events/:event_name/arquivos(.:format)            arquivos#index
                   POST   /events/:event_name/arquivos(.:format)            arquivos#create
 new_event_arquivo GET    /events/:event_name/arquivos/new(.:format)        arquivos#new
      edit_arquivo GET    /arquivos/:id/edit(.:format)                      arquivos#edit
           arquivo GET    /arquivos/:id(.:format)                           arquivos#show
                   PATCH  /arquivos/:id(.:format)                           arquivos#update
                   PUT    /arquivos/:id(.:format)                           arquivos#update
                   DELETE /arquivos/:id(.:format)                           arquivos#destroy

                   ... omitting a bunch of routes ...

            events GET    /events(.:format)                                 events#index
                   POST   /events(.:format)                                 events#create
         new_event GET    /events/new(.:format)                             events#new
        edit_event GET    /events/:name/edit(.:format)                      events#edit
             event GET    /events/:name(.:format)                           events#show
                   PATCH  /events/:name(.:format)                           events#update
                   PUT    /events/:name(.:format)                           events#update
                   DELETE /events/:name(.:format)                           events#destroy