0

几天来,我一直在尝试解决以下问题。如果这是一个常见问题,请原谅我,因为我是 Rails 新手,可能无法在 stackoverflow 或 google 中查询正确的问题/关键字。

我正在构建一个系统,用户将通过电子邮件收到邀请,单击唯一链接,被带到他/她可以接受或拒绝邀请的页面。我被困在用户接受或拒绝邀请的部分。

我围绕两个控制器构建了它:邀请控制器和确认控制器。邀请控制器创建包含名称、电子邮件和唯一生成的令牌的记录。然后控制器将带有令牌的链接通过电子邮件发送到定义的电子邮件。该链接指向确认控制器并传递来自邀请的唯一令牌。但是,当单击链接并接受邀请时,我收到以下错误:

NoMethodError in ConfirmationController#confirm
undefined method `update_attribute' for nil:NilClass

以下是解决此问题的一些代码:

确认控制器.rb

class ConfirmationController < ApplicationController
    def new
      @confirmation = Invitation.find_by_invite_token(params[:invite_token])
    end

    def confirm
      if @confirmation.update_attribute(:accepted, true) 
         flash[:success] = "Invitation confirmed!"
         redirect_to 'static_pages/home'
      else
         flash[:notice] = "Failed :("
         redirect_to 'static_pages/home'
      end
    end
end

路线.rb

match '/confirmation/:invite_token', to: 'confirmation#new'
match '/confirmation/:invite_token/confirm', to: 'confirmation#confirm'

app/views/confirmation/new.html.erb

Click here to accept:
<%= link_to "Confirm", :controller => "confirmation", :action => "confirm" %>
4

3 回答 3

2

你也需要得到你Invitationconfirm方法。

如果您希望 rails 在未找到邀请的情况下引发异常

def confirm
  @confirmation = Invitation.find_by_invite_token!(params[:invite_token])
  @confirmation.update_...
end

不会引发任何异常。在以下情况下,您可能需要手动检查条件。

def confirm
  @confirmation = Invitation.find_by_invite_token(params[:invite_token])
  if @confirmation
    @confirmation.update_...
  else
    # do something
  end
end
于 2013-06-22T20:09:18.553 回答
0

你应该在调用它之前找到confirmation记录update_attribute,就像你在new行动中所做的那样:

@confirmation = Invitation.find_by_invite_token(params[:invite_token])

或者,在找不到记录时抛出异常并向用户呈现 404 页面:

@ocnfirmation = Invitation.find_by_invite_token!(params[:invite_token])
于 2013-06-22T20:08:35.153 回答
0

问题是你从来没有告诉程序@confirmation 是什么。你应该做的是先找到它然后运行更新。请注意,这与不同的答案不同,只是想我会抛出一些变化。

def confirm
  # You're missing this line below. Basic search for the confirmation.
  # Note too that you will have to pass in the parameter `invite_token` for it to work
  # I'm also assuming invite_token is unique among each invitation 
  confirmation = Invitation.where(invite_token: params[:invite_token])

  # Notice that I'm first checking to see if the confirmation record exists, then doing an update
  if confirmation and confirmation.update_attribute(:accepted, true) 
     flash[:success] = "Invitation confirmed!"
     redirect_to 'static_pages/home'
  else
     flash[:notice] = "Failed :("
     redirect_to 'static_pages/home'
  end
end
于 2013-06-22T20:09:09.567 回答