我有一个控制器,我正在做一些时髦的选择。我有一个邀请表,属于一个用户,并且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])并重做我的邀请模型?
答案 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