Map.with_options

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