Этот вопрос сравним с этим , но я спрашиваю его еще раз, потому что предоставленный ответ не решает проблему, и, как говорит человек, задающий этот вопрос: это может быть ошибка в Rails (но никаких последующих действий не дано).
У меня есть следующие маршруты:
resources :books, controller: :projects, type: "Book" do
resources "", as: :book_chapters, controller: :contributions, type: "BookChapter", except: :index, constraints: IdConstraint
end
Это IdConstraint:
class IdConstraint
INVALID_IDS = %w[edit series new]
def self.matches?(request)
!INVALID_IDS.include? request.params[:id]
end
end
Я использую friedly_id, поэтому параметр :id
представляет собой строку, основанную на названии книги или главы книги.
Теперь запрос типа /books/friendly-id-of-book/friendly-id-of-chapter
направляется к действию show
на контроллере book_chapters.
Но я бы также ожидал, что /books/friendly-id-of-book/edit
направит к действию edit
на контроллере books, потому что ограничение на маршрут book_chapters исключает edit
в качестве идентификатора. Это не работает, и кажется, что проблема в IdConstraint
. Если я заменим одну строку в методе matches?
на false
:
class IdConstraint
INVALID_IDS = %w[edit series new]
def self.matches?(request)
false
end
end
.../edit
правильно направляет маршрут к действию редактирования на контроллере книг.
Но когда я только добавляю строку с false
после исходной строки:
class IdConstraint
INVALID_IDS = %w[edit series new]
def self.matches?(request)
!INVALID_IDS.include? request.params[:id]
false
end
end
маршрут завершается неудачей, то есть он направляется к контроллеру book_chapters с идентификатором «edit», в то время как я действительно ожидал бы, что он все еще вернет false, и, таким образом, направит к действию edit контроллера книг.
Я не могу понять, что здесь происходит не так. Есть идеи?