Rails中Devise Invitable报错:undefined method `deliver_invitation'
问题分析与解决:Devise Invitable调用deliver_invitation报错
错误原因
你遇到的NoMethodError本质是方法调用对象错了:User.where(id: @attendee.user_id)返回的是ActiveRecord关系集合对象,而deliver_invitation是Devise Invitable提供给单个User实例的方法,不能直接在集合上调用。
修正方案
方案1:直接获取单个用户实例
修改send_invite方法,用find_by拿到单个User对象后再调用方法:
def send_invite @attendee = Attendee.find(params[:attendee_id]) user = User.find_by(id: @attendee.user_id) user.deliver_invitation if user.present? # 增加判断避免nil调用报错 redirect_to meeting_url(@attendee.meeting) end
方案2:利用模型关联简化代码
如果你的Attendee模型已经定义了belongs_to :user关联,可以直接通过关联获取用户:
def send_invite @attendee = Attendee.find(params[:attendee_id]) @attendee.user.deliver_invitation if @attendee.user.present? redirect_to meeting_url(@attendee.meeting) end
补充说明
你在create方法里用User.invite!配合skip_invitation: true的写法是正确的,已经成功创建了带邀请记录的用户,只要拿到单个用户实例调用deliver_invitation,就能正常触发邀请邮件发送逻辑。
内容的提问来源于stack exchange,提问作者Joe Bloggos
相关产品推荐
相关产品推荐

