NoMethodError(未定义的方法 'deliver_invitation') 设计诱人的轨道

NoMethodError (undefined method `deliver_invitation') devise invitable rails

提问人:Joe Bloggos 提问时间:8/31/2022 更新时间:9/2/2022 访问量:112

问:

您好,我有一个应用程序,其中邀请用户作为与会者

在与会者控制器中,创建与会者时,将创建用户,但不会向系统发送邀请

attendees_controller.rb

def create
    @attendee = Attendee.new(attendee_params)
    @user = User.invite!({email: "#{@attendee.email}"}, current_user) do |u|
      u.skip_invitation = true
    end 
    @attendee.user_id = @user.id
    respond_to do |format|
      if @attendee.save
        format.html { redirect_to meeting_url(@attendee.meeting), notice: "Attendee was successfully created." }
        format.json { render :show, status: :created, location: @attendee }
      else
        format.html { render :new, status: :unprocessable_entity }
        format.json { render json: @attendee.errors, status: :unprocessable_entity }
      end
    end
  end

在同一个控制器中,我有一个send_invite

 def send_invite
    @attendee = Attendee.find(params[:attendee_id])
    User.where(id: @attendee.user_id).deliver_invitation
    redirect_to meeting_url(@attendee.meeting)
  end

当我通过按钮点击它时,我得到

AttendeesController#send_invite 中的 NoMethodError #<ActiveRecord::Relation 的未定义方法“deliver_invitation”

[devise_invitable][1] 明确指出

如果要创建邀请但不发送邀请,可以将 skip_invitation设置为 true。

user = User.invite!(email: '[email protected]', name: 'John Doe') do |u|
  u.skip_invitation = true
end
# => the record will be created, but the invitation email will not be sent

自行生成accept_user_invitation_url时,必须使用raw_invitation_token。此值在邀请用户时暂时可用,并在收到时解密。

accept_user_invitation_url(invitation_token: user.raw_invitation_token)

使用 skip_invitation 时,还必须在向用户发送令牌时设置invitation_sent_at字段。如果不这样做,当用户尝试接受邀请时,将产生“无效的邀请令牌”错误。您可以设置列,也可以调用deliver_invitation发送邀请并设置列:

user.deliver_invitation

我错过了什么? [1]:https://github.com/scambra/devise_invitable#send-an-invitation-

Ruby-on-Rails Ruby-On-Rails-7 设计

评论


答:

1赞 Leon 8/31/2022 #1

我猜是用户模型上的一个实例方法。(通过devise_invitable)。
在这种情况下,您可能想要这样的东西:
.deliver_invitation

User.where(id: @attendee.user_id).each do |user|
   user.deliver_invitation
end
1赞 Sachin Singh 9/2/2022 #2

假设是 User 模型的实例方法,您可以按如下方式修改您的方法:deliver_invitationsend_invite

def send_invite
  @attendee = Attendee.find(params[:attendee_id])
  user = User.find(@attendee.user_id)
  user.deliver_invitation
  redirect_to meeting_url(@attendee.meeting)
end