Привет, есть у меня модели, но Rails неверно определяет пути для них (т.е. приходится писать form_for(@model, url: my_new_url_path). Так вот хотелось бы однажды определить это в модели и не писать url:
Возможно ли это сделать?
Обычно, если компьютер что-то неправильно определяет, значит он используется не по назначению. Особенно легко допустить такую ошибку в такой "конвенциальной" среде, как рельсы.
Что значит, неправильно определяет?
Вы делаете ссылку вида:
/users/username вместо /users/id ?
У меня есть ресурс, внутрь которого вложен другой ресурс, который относится к определенному контроллеру, который имеет модель, которая по полиморфным связям подключается к модели-родителю. И редактируем мы модель-родитель (ну и эту самую модель тоже). Так вот, когда я пытаюсь редактировать любую из этих моделей, то случается попытка вызвать несуществующий хелпер пути.
Например, если у меня родительский ресурс это root, а вложенный - это res, то правильный хелпер - это root_res_path, в то время как Rails не знает отношение всех этих ресурсов и по модели пытается дернуть хелпер у модели Res - это res_path, что, конечно не верно.
Boober: "контроллеру, который имеет модель"
Контроллер не может ничего иметь, кроме экшенов (методов). Модели никак вообще не привязаны к контроллерам.
Boober: хоть все и замудрено и мало чего понятно, но все же проблемы должны решаться комбинацией form_for [...] и нейминга роутов.
Если совсем никак, то можно, конечно, попробовать, как тут пишут (хоть и кейс другой) - stackoverflow.com/questions/3736759/ruby-on-rails-... - используя рут_кей
Но это костыль, в данном случае, лучше разобраться. Скорей всего, если сейчас подстроитесь под рельсы, дальше получите от этого бонусы
Чтобы правильно генерировать пути для вложенных ресурсов, в form_for первым параметром нужно передавать массив: form_for [@article, @comment] do
получится article_comment_path или '/article/:article_id/comment/:id'
Jeiwan: все действо происходит в контроллере Test. Она подресурс Inner. Модель Model.
Пишем form_for([:woof, @model]) Получаем woof_model_path, а должно быть woof_inner_test_path.
Boober:
Почему [:woof, @model] должен быть woof_inner_test_path? А model куда делась?
Вся проблема в том, что вы перемешали ресурсы. Распутайте этот клубок, разложите по полочкам, где нужно, сделайте scope/namespace, и таких проблем не будет. То есть вы сами себе создали такие проблемы, не следуя конвенциям рельс.