2

私はDeviseとCanCanを使用してユーザーとユーザー権利を管理しています。私が欲しいのは:普通のユーザーは自分の投稿を更新できるはずです。最も重要なモデルはアクティビティと呼ばれます。

私が普通のメンバーのために持っている能力モデルでは:

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

(3行目の構文については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

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

終わり

問題は、アクティビティが正しく更新されないのはなぜですか?私はすべてのアイデアに感謝しています!

4

3 に答える 3

3

の 1 行目と 3 行目を入れ替えます。ActivitiesController#update

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

  authorize! :update, @activity
  ...
end

Cancan で推奨される方法を使用することもできます。load_and_authorize_resource

于 2012-05-04T13:51:58.050 に答える
1

あなたの投稿とコメントがユーザーに属している場合、これを行うことができます

can :manage, [Post,Comment], :user_id=>user.id
于 2012-05-02T18:42:33.780 に答える
0

能力の例:

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

このチュートリアルを試してみてください: Railscasts CanCan

于 2012-05-04T14:16:56.090 に答える