Не удалось найти ProjectSite без идентификатора - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть две модели - ProjectSite и Project.

Я загрузил файл в таблицу project_sites, теперь я хочу получить доступ к этому файлу в projects#index. Но я получаю сообщение об ошибке

Couldn't find ProjectSite without an ID

Между Project и ProjectSite существует связь один ко многим.

projects_controller.rb

  before_action :find_project_sites?

    def find_project_sites?
      @project_sites = ProjectSite.find(params[:project_site_id])
    end

в виде контроллера

<% @project_sites.each do |project_site| %>
<% end %>

вот схема.rb

  create_table "project_sites", force: :cascade do |t|
    t.string "attendance"
    t.integer "user_id"
    t.integer "project_id"
    t.index ["project_id"], name: "index_project_sites_on_project_id"
    t.index ["user_id"], name: "index_project_sites_on_user_id"
  end

  create_table "projects", force: :cascade do |t|
    t.string "project_name"
    t.datetime "created_at", null: false
    t.integer "user_id"
  end

rout.rb

resources :project_sites
resources :projects
devise_for :users

project.rb (модель)

has_many :projects
has_many :project_sites

1 Ответ

1 голос
/ 29 апреля 2020

При разрешении действия project#index ваши параметры пусты, поэтому params[:project_site_id] будет, очевидно, nil, поскольку вы работаете с коллекцией, а не с одним объектом.

Я все еще не уверен то, что вы пытаетесь достичь, но я предполагаю, что вы пытаетесь настроить has_many связь на Project модели с ProjectSite. После правильной настройки связи в моделях, в #index вы можете достичь project_sites для каждого из проиндексированных проектов:

Project.all.each do |project|
  project.project_sites
end

При действиях с участниками (#show, #create, #edit, #update et c.) Вам нужно настроить проект

@project = Project.find(:id)

Это может быть сделано в :befor_action, но ограничено only: [:show, :edit, :create, :update, :destroy]. Далее вы можете получить связанные сайты по @project.project_sites

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...