限制用户在相关模型的控制器中的访问

时间:2011-09-07 15:48:44

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个控制器,我正在做一些时髦的选择。我有一个邀请表,属于一个用户,并且has_one用户。

在销毁邀请时,我希望“has_one用户”正在进行销毁,在我的控制器中,我首先会收到用户被邀请的一系列邀请:

def destroy
    @invitations = Invitation.find_by_recipient_email(current_user.email)

从这个@invitations数组中,我想使用:id参数进行查找。有没有办法做这样的事情:

@invitations = Invitation.find_by_recipient_email(current_user.email)
    @invitation = @invitations.find(params[:id])

这样我就可以限制用户只能访问他们被邀请的邀请(使用current_user方法),然后选择特定的邀请。我目前不能这样做。因为.find不适用于数组。

感谢您的帮助/指示。

编辑:对不起我让帖子有点混乱,这里有更多信息:

这是我现在的整个销毁方法,我只想删除一条记录:

def destroy
    @invitations = Invitation.find_by_recipient_email(current_user.email)
    @invitation = @invitations.find(params[:id])  

    if @invitation.destroy
      redirect_to invitations_path, :notice => "Declined invitation"
    else
      redirect_to :back
    end
  end

我的邀请对象如下:

Invitation(id: integer, list_id: integer, sender_id: integer, recipient_email: string, created_at: datetime, updated_at: datetime) 

其中send_id和recipient_email是两个不同的用户。

我的邀请.rb:

belongs_to :sender, :class_name => 'User'
  has_one :recipient, :class_name => 'User'

也许问题是我会调用类似current_users.invitations.find(params [:id])并重做我的邀请模型?

2 个答案:

答案 0 :(得分:2)

find是ActiveRecord方法。您可以使用Ruby可枚举方法select返回匹配元素的数组,然后从数组中获取您的邀请。

inv = @invitations.select { |i| i.id == params[:id] }
@inviation = inv.empty? ? nil : inv[0]

答案 1 :(得分:2)

您可以这样做:

invitatation_scope = Invitation.where(["recipient_email = ?",current_user.email])
@invitation =  invitation_scope.find(params[:id])

但你应该使用before_filter:

before_filter :load_user_invitation, :only=>[:edit,:update,:destroy]

def load_user_invitation
  @invitation = Invitation.where(["recipient_email = ?",current_user.email]).find(params[:id])
end