2013-12-04 4 views
2

у меня есть файл маршрутов, который выглядит примерно так (Это очень глубоко вложенными ... Я знаю):Rails создает маршруты из объектов

scope :admin, module: :admin do 
    namespace :breadth do 
     resources :areas, as: 'areas' do 
     resources :sequences, as: 'sequences' 
     end 
    end 
    end 

rake routes При запуске я получаю обратно все маршруты, включая один breatdh_area_sequences (это именно то, что я хочу). Проблема заключается в том, что когда я создаю форму рельсы создает неправильный URL на основе параметров, я придав ему:

= form_for [:breadth, breadth_sequence.area, breadth_sequence] do |f| 
    ... 

Это дает мне:

undefined method `breadth_breadth_area_breadth_sequences_path' for #<#<Class:0x007fe55bcf16b8>:0x007fe55d9a3f68> 

Точно как же рельсы взять этот массив параметров и создать URL-адрес из него? Я предполагаю, что он вызывает метод для каждого объекта? Я могу это переопределить, чтобы получить именованный маршрут, который я ожидаю (не переопределять: url on form_for)

+0

вы можете просто попробовать «form_for breadth_area_sequences_path» – beck03076

+0

я мог, но в зависимости от breadth_sequence' является 'ли новая запись или нет, этот URL изменится (' breadth_area_sequence_path' для существующих записей и 'breadth_area_sequences_path' для новых объектов) , Я бы хотел, чтобы рельсы сами поняли это без меня, указав URL-адрес –

ответ

0

Для выполнения этой работы мне пришлось переопределить методы self.model_name как на BreadthArea, так и на BreadthSequence. Этот метод показывает, как form_for определяет URL-адрес, когда объект (или массив объектов) используется при первом аргументе.

class BreadthArea < ActiveRecord::Base 
    def self.model_name 
    ActiveModel::Name.new(self, nil, "Area") 
    end 
    ... 
end 

class BreadthSequence < ActiveRecord::Base 
    def self.model_name 
    ActiveModel::Name.new(self, nil, "Sequence") 
    end 
    ... 
end 
+1

Изменение чего-то, столь широко используемого в качестве имени модели, может иметь другие последствия для вашей кодовой базы, я бы не рекомендовал это делать, много кода основывается на этой информации. –

0

Поскольку вы хотите назвать свои объекты иначе, чем маршруты, это не сработает. Ваши маршруты/контроллеры должны быть названы так же, как ваши модели названы, если ваша модель BreadthArea (как считает маршрут), ваш маршрут также должен быть назван таким же образом.

+0

. Это не совсем так. Смотрите мое решение (не самое элегантное, но, безусловно, работает). –

Смежные вопросы