我正在使用 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 %>
这样做:如果活动是由当前成员创建的,它只显示更新和删除链接。
但是,如果成员更新活动,则不会保存更改,并且不会将成员发回活动 - 因为他/她应该在成功更新后。
以下是Activities-controller中的更新操作:
# PUT /activities/1.xml
def update
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
端
问题是:为什么活动没有正确更新? 我很感激所有的想法!
答案 0 :(得分:3)
交换ActivitiesController#update
def update
@activity = Activity.find(params[:id])
authorize! :update, @activity
...
end
您还可以使用the preferred way with Cancan:load_and_authorize_resource
答案 1 :(得分:1)
如果您的帖子和评论属于用户,则可以执行此操作
can :manage, [Post,Comment], :user_id=>user.id
答案 2 :(得分:0)
例如能力:
if user.role?(:author)
can :create, Article
can :update, Article do |article|
article.try(:user) == user
end
end
尝试使用本教程:Railscasts CanCan 也许帮助