Acciones extras en plugin Restful Authentication y doc escritura plugins

Buenas a todos.

He estado probando el plugin restful authentication
(http://agilewebdevelopment.com/plugins/restful_authentication), y he
querido añadirle alguna funcionalidad nueva como, por ejemplo, poder
editar la dirección de correo o la contraseña (con las validaciones
pertinentes). Bueno, la cuestión es que no he podido poner la acción
“edit” o “modify” en el controlador “users”. El server me indicaba que
no había ninguna acción. La url era http://localhost:3000/users/edit (y
también con modify), me decía que no hay action, cuando lo tenía
definido en el controlador.

Luego probé exactamente lo mismo pero en el controlador “session” y si
que funciona a la perfección. Me he quedado con la duda de porque no he
podido ponerlo en el controlador “users”. He mirado por las librerías
del plugin y los helpers (vacíos) y no he encontrado nada, ¿alguien sabe
que puede ser el que “no me permitiera” poner la acción en el
controlador “users”?

Por último, ¿me recomendáis alguna documentación para la creación de
plugins?

Saludos y feliz año a todos.

El plugin no incluye la accion edit por default, pero se la puedes
agregar si quieres.

Sólo agregala en el controller de users junto con update

def edit
@user = User.find(params[:id])
end

def update
@user = User.find(params[:id])
if @user.update_attributes(params[:user])
redirect_to home_path
else
render :action => ‘edit’
end
end

Y claro que también debes agregar tu vista para edit conteniendo el
formulario necesario. Con esto ya puedes usar el helper
edit_user_path(@user) el cual generará una url como
http://localhost:3000/users/edit/1

Además no creo que necesites cambiar las validaciones, ya tienen el
condicional :if lo que hace que seran validadas correctamente para las
acciones especificas.

Lo de editar las sessions no lo entiendo muy bien… ese controlador
solo es para manejar las sesiones de los usuarios, no habria porque
editarlas.

Yo también he modificado el plugin, añadiendo nuevos métodos en el
controlador Users y me funciona a la perfección tal y como comenta
Edgar.

El 02/01/2008, a las 20:45, Edgar J. Suarez
escribió:

El plugin no incluye la accion edit por default, pero se la puedes

Pues seré yo el que tiene algo raro por ahí. Lo tenía hecho en el
controlador “session” y funcionando. Paso los métodos al controlador
“users” y me dice:

URL: http://localhost:3000/users/edit

Unknown action

No action responded to show

Tengo el siguiente código en el controlador “users”:

Actualización del perfil

def edit
@user = User.find(current_user.id)
end

def update
@user = User.find(current_user.id)
if @user.update_attributes(params[:user])
flash[:notice] = “Inofrmation updated”
redirect_to :action => ‘edit’
else
render :action => ‘edit’
end
end

Fin actualización del perfil

Y tengo la vista edit en el lugar que le corresponde
(app/views/users/edit.rhtml).

Esto es lo que tenía en el controlador "session"y funcionaba, en users
no.

NOTA: tengo puesto el before filter de login required para los métodos
edit y update.

Saludos.

Emili Parreño escribió:

Cuando intentas acceder a la ruta users/edit te falta el id del usuario
que estás editando, y Rails mapea la ruta como si fuera users/1 (cree
que la palabra edit es el id del usuario que quieres ver) la cual
corresponde a la action show.

Supon que tienes en una vista lo siguiente: <%= link_to ‘editar’,
edit_user_path(current_user) %>. Eso te genera la ruta correcta
users/edit/1 (1 o el id del usuario en cuestión).

Despues en tu controlador, si el update se hace correctamente
redireccionas de nuevo a la acción edit igualmente sin ID por lo que
dará el mismo error. Trata de redireccionar a otra ruta (tu home por
ejemplo) o incluye el id del usuario con alguna de las siguientes
opciones:

redirect_to edit_user_path(current_user)

También puedes ahorrarte consultas a la DB cambiando @user =
User.find(current_user.id) por @user = current_user ya que el método
current_user te regresa el mismo objeto.

Creo que tiene algo que ver con las rutas. Fíjate que el error te dice
que ninguna acción ha respondido a “show”, entiendo con eso que no ha
ido a la acción “edit” que era lo que querías.

Saludos

Valentín Palacios escribió:

Se me pasaron las otras opciones :stuck_out_tongue:

Edgar J. Suarez wrote:

Despues en tu controlador, si el update se hace correctamente
redireccionas de nuevo a la acción edit igualmente sin ID por lo que
dará el mismo error. Trata de redireccionar a otra ruta (tu home por
ejemplo) o incluye el id del usuario con alguna de las siguientes
opciones:

redirect_to edit_user_path(current_user)

redirect_to :action => ‘edit’, :id => current_user
redirect_to url_for(:action => ‘edit’, :id => current_user)

Si la accion destino se encuentra en otro controlador tendrás que
especificarlo:

redirect_to :controller => ‘articles’, :action => ‘index’

Tendrias que poner algo de codigo para ver cual es el problema, yo he
agregado metodos a users y funciona.
Deberias revisar las routes, pero sin codigo o mensajes de error es
dificil
ayudar.

saludos,
Juan P…

Muchas gracias, ya me funciona correctamente. Atenderé a tus consejos y
ahorraré consultas a la base de datos :wink:

Saludos.

Edgar J. Suarez escribió:

On Jan 2, 2008 8:04 PM, Valentín Palacios [email protected]
wrote:

Buenas a todos.

He estado probando el plugin restful authentication
(http://agilewebdevelopment.com/plugins/restful_authentication), y he
querido añadirle alguna funcionalidad nueva como, por ejemplo, poder
editar la dirección de correo o la contraseña (con las validaciones
pertinentes). Bueno, la cuestión es que no he podido poner la acción
“edit” o “modify” en el controlador “users”. El server me indicaba que
no había ninguna acción. La url era http://localhost:3000/users/edit (y
también con modify), me decía que no hay action, cuando lo tenía
definido en el controlador.

Puede ser porque te falta pasarle un id.

http://localhost:3000/users/:id/edit

(o http://localhost:3000/users/:id;edit si estás con rails version < 2.x)

En caso de querer modificar el usuario de session y no querer pasar el
id yo suelo utilizar una custom route.

map.user_edition “user/edit”, :controller => ‘users’, :action =>
‘edit’ # Seria en tu caso

Despues la llamas como user_edition_path y veras una hermosa URL en
singular como: /user/edit

Salu2!