Ruby on rails 确认控制器中的命名错误

Ruby on rails 确认控制器中的命名错误,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,几天来,我一直在努力解决以下问题。如果这是一个常见问题,请原谅,因为我是rails新手,可能无法在stackoverflow或google中查询正确的问题/关键字 我正在构建一个系统,用户将通过电子邮件收到邀请,单击唯一链接,进入一个页面,在那里他/她可以接受或拒绝邀请。我被用户接受或拒绝邀请的部分卡住了 我围绕两个控制器构建了它:一个邀请控制器和一个确认控制器。邀请控制器创建一个包含名称、电子邮件和唯一生成的令牌的记录。然后,控制器通过电子邮件将带有令牌的链接发送到已定义的电子邮件。该链接指向

几天来,我一直在努力解决以下问题。如果这是一个常见问题,请原谅,因为我是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
app/views/confirmation/new.html.erb

Click here to accept:
<%= link_to "Confirm", :controller => "confirmation", :action => "confirm" %>
单击此处接受:
“确认”,:操作=>“确认”%>

在调用
update\u attribute
之前,您应该找到
confirmation
记录,就像您在
new
操作中所做的那样:

@confirmation = Invitation.find_by_invite_token(params[:invite_token])
或者,在找不到记录时引发异常并向用户呈现404页面:

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

问题是你从未告诉程序什么是@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

您还需要在
确认
方法中获取您的
邀请

如果您希望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

如果找不到邀请怎么办?理想情况下,应该首先检查确认记录是否已找到,然后进行更新。
find\u by\u invite\u token
应该引发异常否,不应该。它只返回
nil
。要使其抛出exeption,您应该使用
find\u by\u invite\u令牌。这在更新记录时起到了作用,但是,一旦我在视图中单击“确认”,数据库会得到相应的更新,但是,我在Chrome中遇到以下错误:
没有收到任何数据无法加载网页,因为服务器没有发送任何数据。
解决了这个问题。出于某种原因,我不得不将
redirect\u改为
render
,谢谢,我想这就成功了。但是,在我的视图中单击“确认”后,数据库会得到相应的更新,但是,我在Chrome中遇到以下错误:
未收到任何数据无法加载网页,因为服务器未发送任何数据。
感谢您的建议。即使总是有一个invite_令牌,我想最好还是再次显式检查它?
def confirm
  @confirmation = Invitation.find_by_invite_token(params[:invite_token])
  if @confirmation
    @confirmation.update_...
  else
    # do something
  end
end