Позволяване на потребителите да актуализират собствените си публикации с CanCan и Devise

Използвам Devise и CanCan за управление на потребители и потребителски права. Това, което искам е: обикновените потребители ще могат да актуализират собствените си публикации. Най-важният модел се нарича активност.

В модела на способности, който имам за обикновени членове:

elsif user.role? :Member
   can :read, :all
   can :create, :all
   can :manage, Activity, :user_id=>user.id

(Благодаря на Yuriy Goldshtrakh за синтаксиса на третия ред)

В индексния изглед на дейностите имам:

<% 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 %>

Това работи: показва само актуализацията и връзката за изтриване, ако активността е създадена от текущия член.

Ако обаче членът актуализира дейността, промените не се запазват и членът не се връща обратно към дейността - както трябва да бъде след успешно актуализиране.

Ето действието за актуализиране в контролера за дейности:

  # PUT /activities/1.xml

деф актуализация

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

край

Въпросът е: Защо дейността не се актуализира правилно? Благодарен съм за всички идеи!


person The_Fritz    schedule 02.05.2012    source източник


Отговори (3)


Разменете ред 1 и 3 на ActivitiesController#update

def update
  @activity = Activity.find(params[:id])

  authorize! :update, @activity
  ...
end

Можете също да използвате предпочитания начин с Cancan: load_and_authorize_resource

person theodorton    schedule 04.05.2012
comment
Ти си прав! Това беше причината да не работи. Благодаря много! - person The_Fritz; 04.05.2012

ако вашата публикация и коментари принадлежат на потребителя, можете да направите това

can :manage, [Post,Comment], :user_id=>user.id
person Yuriy Goldshtrakh    schedule 02.05.2012

Например способност:

if user.role?(:author)
        can :create, Article
        can :update, Article do |article|
          article.try(:user) == user
        end
      end

Опитайте да направите с този урок: Railscasts CanCan Може би помощ

person quatermain    schedule 04.05.2012