У меня была такая же проблема. Модель действительно не может / не должна ничего знать о контроллерах. Задача контроллера - определить, какой ресурс запрашивается, и вызвать модель для доступа к нему. Если ваш AdminController должен использовать стандартный числовой идентификатор, вам не нужно нажимать to_param
.
Как оказалось, решение довольно простое, и я использую его в производстве.
Предполагая, что у вас есть пространство имен для ваших контроллеров, у вас будут MyModelController и Admin :: MyModelController, а также их помощники. В Админе делай вещи стандартным способом. В MyModelController выполните следующие действия:
В действиях с вашим ресурсом обращайтесь к params[:id]
, но рассматривайте его как постоянную ссылку (URL). Например
def get
@my_model = MyModel.find_by_url(params[:id])
...
end
В вашем MyModelHelper
def my_model_path my_model
super my_model.url
end
def my_model_url my_model
super my_model.url
end
Мне показалось, что это был лучший способ "не сражаться" с рельсами и получить то, что мне нужно было сделать.
Возможно, есть более разумный способ переопределить именованные маршруты. Также я думаю, что вы не можете использовать helper :all
с таким подходом, если вы не проверите состояние того, являетесь ли вы администратором или нет, прежде чем создавать пути / URL.