Tuve el mismo problema. Un modelo realmente no puede/no debería saber nada sobre los controladores. El trabajo del controlador es determinar qué recurso se solicita y llamar al modelo para acceder a él. Si su AdminController necesita usar la identificación numérica estándar, no querrá tocar to_param
.
Como resultado, la solución es bastante simple, y la utilizo en producción.
Suponiendo que hayas asignado un nombre a tus controladores, tendrás un MyModelController y un Admin :: MyModelController, junto con sus ayudantes. En Admin, haz las cosas de la manera estándar. En MyModelController, haga lo siguiente:
En sus acciones de recursos, consulte params[:id]
pero trátelo como un enlace permanente (URL).Por ejemplo
def get
@my_model = MyModel.find_by_url(params[:id])
...
end
En su MyModelHelper
def my_model_path my_model
super my_model.url
end
def my_model_url my_model
super my_model.url
end
Para mí sentía que esto era la mejor manera de "no luchar" rieles y conseguir lo que necesitaba hecho.
Puede haber una manera más inteligente de anular las rutas nombradas. Además, creo que no puede usar helper :all
con este enfoque, a menos que compruebe si está en administración o no antes de generar rutas/url.
mismo digo, no me gustaría la ID en el URL porque quiero separar estrictamente las partes internas del modelo de la representación externa a través de la URL ... posible ... –
Esto no pondrá la ID en la URL. Todo lo que hace es darle otro método de clase, BlogPost.find_by_param, que utiliza en lugar de BlogPost.find_by_url, y eso funciona ya sea que le proporcione una ID o una URL. –