Классы Shallow, Nested, Namespaced в Rails 5 - PullRequest
0 голосов
/ 01 июля 2019

У меня есть следующие настройки:

# routes.rb

namespace :forum do
  resources :sections, shallow: true do
    resources :threads, shallow: true do
      resources :posts
    end
  end
end

с ожидаемыми моделями / и т.д.Rails-маршруты выглядят так: Picture of rails routes Когда я пытаюсь использовать

# /app/views/forum/threads/new.html.haml
# @forum_section / @forum_thread correctly set in controller

= simple_form_for [@forum_section, @forum_thread] do |f|
  # some form content here

, я получаю сообщение об ошибке:

ActionView::Template::Error (undefined method `forum_section_forum_threads_path' for #<#<Class:0x00007f6af7623b80>:0x00007f6af49780b8>
Did you mean?  forum_section_threads_path):

Ну да, конечно, я имел в видуэто.

Но должен быть лучший способ, чем:

= simple_form_for [@forum_section, @forum_thread], url: forum_section_threads_path(@forum_section)

Фу.Нарушение DRY в одной строке.

Я знаю Я, должно быть, упускаю что-то глупое здесь - выручите меня?

Ответы [ 2 ]

1 голос
/ 01 июля 2019

Решение без пространства имен

Попробуйте

= simple_form_for [:thread, @forum_section, @forum_thread] do |f|
  # some form content here

Источник

Это предполагает, что @forum_section является постоянным экземпляром Section class и @forum_thread - это новый экземпляр класса Thread.

Обычно, если ваши маршруты имеют ресурсы, такие как :sections и :threads, ваши модели будут называться Section и Thread.И для соглашения, ваши переменные экземпляра также будут называться @section и @thread, но их имя не так важно.Если ваша установка отличается от этой, Rails может затруднить угадывание, какой URL вы пытаетесь сгенерировать.

Решение с пространством имен

Если вы хотите, чтобы модели оставались неизменнымиПространство имен, например Forum::Section и Forum::Thread, вы также должны изменить имя по умолчанию для помощников пути

namespace :forum do
  resources :sections, shallow: true, as: :forum_sections do
    resources :threads, shallow: true, as: :forum_threads do
      resources :posts
    end
  end
end

Source

0 голосов
/ 01 июля 2019
#controller
@forum_thread = Thread.new

#view
= simple_form_for [:forum, @forum_section, @forum_thread]

Действие формы будет POST / section /: id / threads

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