Hola gente,
En algunas circunstancias las URIs no siguen un patrón standard, en mi
caso
algunas veces necesito ejecutar la acción new del recurso post sin el
user_id y algunas veces pasando cómo parametro user_id, hago lo
siguiente en
routes :
map.with_options :controller => “posts” do |m|
m.with_options :conditions => {:method => :get} do |get|
get.new_user_post “users/:user_id/posts/new”, :action => “new”
end
end
Entiendo que con rutas anidadas se resuelve esto (el tipico user-post)
solo
fué un ejemplo que cité, pero existen 2 circunstancias (se menciona en
el
libro “Practical REST on Rails 2 Projects”) dónde ó bien no queremos
exponer
el completo conjunto de acciones ó cómo les decia las URIs no siguen un
patrón standard. El pedazo de código que expuse está bien para varias
acciones, pero cuando es solo una existe un método más simple ?
Saludos y gracias
2008/9/19 aprendiz basico [email protected]:
En algunas circunstancias las URIs no siguen un patrón standard, en mi caso
algunas veces necesito ejecutar la acción new del recurso post sin el
user_id y algunas veces pasando cómo parametro user_id
Para este caso concreto yo tengo un patron que me funciona bien.
Partimos del canonico
map.resources :posts
map.resources :users, :has_many => :posts
En ambos casos cuando va de posts se llama a PostsController donde
tengo un filtro de alta prioridad
def find_target
@target = Post
unless params[:user_id].blank?
@target = User.find(params[:user_id]).posts
end
end
de manera que todo lo demas parte de @target, por ejemplo
def index
@target.paginate(…)
…
end
Esta escrito sobre la marcha y sin control de errores pero se ve la
idea.
aprendiz, lo puedes poner todo en una sola línea:
map.new_user_post “users/:user_id/posts/new”, :controller =>
‘posts’, :action => ‘new’, :conditions => { :method => :get }
Salutaciones,
Isaac Feliu
Si vives con ‘edge’ como muchos de nosotros puedes usar esta nueva
caracteristica:
http://ryandaigle.com/articles/2008/9/7/what-s-new-in-edge-rails-shallow-routes
Saludos.
El 19 de septiembre de 2008 13:58, Ruben. D.
[email protected]escribió:
Si vives con ‘edge’ como muchos de nosotros puedes usar esta nueva
caracteristica:
http://ryandaigle.com/articles/2008/9/7/what-s-new-in-edge-rails-shallow-routes
Primeramente gracias Ruben. Cool feature !!! Tengo un pequeño
inconveniente
con la shallow route option :
map.resources :users, :shallow => true do |user|
user.resources :posts do |post|
post.resources :comments
end
end
No me está generando las rutas new_user_post_comment, etc. Es decir las
de
3er. nivel, sin el :shallow si me las genera. Ignoro si se trata de un
posible bug.
PD. Estoy utilizando Edge, clonado al dia de hoy.
Hola aprendiz, es normal que no te cree ese helper, ya que para crear un
nuevo recurso necesitas el identificador del padre(en este caso concreto
donde hay jerarquias de recursos), un ejemplo:
Cual de estas dos URL tiene sentido:
/articles/new
o
/users/1/articles/new
no crees que es la ultima?
Saludos.
El 19 de septiembre de 2008 12:38, Isaac Feliu Pérez
[email protected]escribió:
aprendiz, lo puedes poner todo en una sola lÃnea:
map.new_user_post “users/:user_id/posts/new”, :controller =>
‘posts’, :action => ‘new’, :conditions => { :method => :get }
Hola Isaac,
Funciona bien. Muchas gracias.
Un saludo.
El 19 de septiembre de 2008 13:14, Xavier N. [email protected]
escribió:
Para este caso concreto yo tengo un patron que me funciona bien.
Partimos del canonico
map.resources :posts
map.resources :users, :has_many => :posts
Hola Xavier,
Muy buena técnica. Muchas gracias.
Un saludo.
2008/9/19 aprendiz basico [email protected]
No me está generando las rutas new_user_post_comment, etc. Es decir las de
3er. nivel, sin el :shallow si me las genera. Ignoro si se trata de un
posible bug.
PD. Estoy utilizando Edge, clonado al dia de hoy.
Probé con un nivel menos :
map.resources :user, :shallow => true do |user|
user.resources :posts
end
y no genera la ruta new_post (GET /post/new).
Estas son las rutas generadas :
user_index GET /user
formatted_user_index GET /user.:format
POST /user
POST /user.:format
new_user GET /user/new
formatted_new_user GET /user/new.:format
edit_user GET /user/:id/edit
formatted_edit_user GET /user/:id/edit.:format
user GET /user/:id
formatted_user GET /user/:id.:format
PUT /user/:id
PUT /user/:id.:format
DELETE /user/:id
DELETE /user/:id.:format
user_posts GET /user/:user_id/posts
formatted_user_posts GET /user/:user_id/posts.:format
POST /user/:user_id/posts
POST /user/:user_id/posts.:format
new_user_post GET /user/:user_id/posts/new
formatted_new_user_post GET /user/:user_id/posts/new.:format
edit_post GET /posts/:id/edit
formatted_edit_post GET /posts/:id/edit.:format
post GET /posts/:id
formatted_post GET /posts/:id.:format
PUT /posts/:id
PUT /posts/:id.:format
DELETE /posts/:id
DELETE /posts/:id.:format
/:controller/:action/:id
/:controller/:action/:id.:format
Saludos y gracias