Permitir que los usuarios actualicen sus propias publicaciones con CanCan y Devise

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!

preguntado el 02 de mayo de 12 a las 19:05

3 Respuestas

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

¡Tienes razón! Esa fue la razón por la que no funcionó. ¡Muchas gracias! - el_fritz

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

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 or haz tu propia pregunta.