Permitir que los usuarios actualicen sus propias publicaciones con CanCan y Devise
Frecuentes
Visto 999 veces
2
Estoy utilizando Idear y CanCan para gestionar usuarios y derechos de usuario. Lo que quiero es que los usuarios normales puedan actualizar sus propias publicaciones. El Modelo más importante se llama Actividad.
En el modelo de habilidad que tengo para los miembros ordinarios:
elsif user.role? :Member
can :read, :all
can :create, :all
can :manage, Activity, :user_id=>user.id
(Gracias a Yuriy Goldshtrakh por la sintaxis de la tercera línea)
En la vista de índice de las actividades, tengo:
<% if can? :update, activity %>
<br />
<%= link_to 'Update', edit_activity_path(activity) %>
<% end %>
<% if can? :delete, activity %>
<%= link_to 'Delete', activity, :confirm => 'Really?', :method => :delete %>
<% end %>
Esto funciona: solo muestra el actualización y el enlace de eliminación, si la Actividad fue creada por el miembro actual.
Sin embargo, si el miembro actualiza la actividad, los cambios no se guardan y el miembro no vuelve a la actividad, como debería ser después de una actualización exitosa.
Aquí está la acción de actualización en el controlador de actividades:
# PUT /activities/1.xml
def actualizar
authorize! :update, @activity
@activity = Activity.find(params[:id])
respond_to do |format|
if @activity.update_attributes(params[:activity])
format.html { redirect_to(@activity, :notice => 'Activity was successfully updated.') }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @activity.errors, :status => :unprocessable_entity }
end
end
final
La pregunta es: ¿Por qué no se actualiza correctamente la actividad? Estoy agradecido por todas las ideas!
3 Respuestas
3
Intercambiar línea 1 y 3 de la ActivitiesController#update
def update
@activity = Activity.find(params[:id])
authorize! :update, @activity
...
end
También podrías usar la forma preferida con Cancan: load_and_authorize_resource
contestado el 04 de mayo de 12 a las 14:05
1
si su publicación y comentarios pertenecen al usuario, puede hacer esto
can :manage, [Post,Comment], :user_id=>user.id
contestado el 02 de mayo de 12 a las 19:05
0
Por ejemplo habilidad:
if user.role?(:author)
can :create, Article
can :update, Article do |article|
article.try(:user) == user
end
end
Intenta hacerlo con este tutorial: Railscasts CanCan tal vez ayuda
contestado el 04 de mayo de 12 a las 15:05
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas ruby-on-rails devise cancan or haz tu propia pregunta.
¡Tienes razón! Esa fue la razón por la que no funcionó. ¡Muchas gracias! - el_fritz