UrlGenerationError缺少必需的键[:id]

时间:2015-10-11 11:09:04

标签: ruby-on-rails

我已注册,我想向用户发送电子邮件激活。但是我有一个嵌套属性,用户属于公司。

错误:

CompaniesSignupTest#test_valid_signup_information:
ActionView::Template::Error: No route matches {:action=>"edit", :controller=>"account_activations", :email=>"user@example.com", :id=>nil} missing required keys: [:id]

现在可行:

def create
 log_in @company.users.first
 redirect_to root_path
end

然而,当我尝试发送电子邮件时:

def create
 UserMailer.account_activation(@company.users.first).deliver_now
 redirect_to root_url
end

我收到错误,表示无法找到ID。我觉得很奇怪,因为它能够在登录中找到ID,但不能在这里找到。

这是请求参数:

"company"=>{"users_attributes"=>{"0"=>{"first_name"=>"eorkge",
 "last_name"=>"okerogkeogk",
 "email"=>"egreoke@ergokeoke.com",
 "password"=>"[FILTERED]"}},
 "name"=>"oekgoekg"},
 "commit"=>"Create Company"}

和路线:

<%= link_to "Activate account", edit_account_activation_url(@user.activation_token,
                                                email: @user.email) %>

和mailers / user_mailer:

  def account_activation(user)
    @user = user
    mail to: user.email, subject: "Account activation"
  end

路线:

  resources :account_activations, only: [:edit]

捆绑执行耙路线的结果| grep account_activation

edit_account_activation GET    /account_activations/:id/edit(.:format) account_activations#edit

注意: 当我检查预览邮件时,我能够让它工作。它以纯文本形式呈现URL:

http://localhost:3000/account_activations/qsdBBow-dcKI00Jf3awu5Q/edit?email=demo%40demo.com

并且user_mailer_preview方法是:

  def account_activation
    user = User.first
    user.activation_token = User.new_token
    UserMailer.account_activation(user)
  end

3 个答案:

答案 0 :(得分:0)

同样的问题发生在我身上,以下工作正常。

我不是像对常规@instance variable那样只将对象(link_to)传递给route_path助手,而是明确提到了:id route_url 1}}。

在你的情况下,它将是:

<%= link_to 'Activate account', edit_account_activation_url(id: @user.id)  %>

答案 1 :(得分:-1)

正如我之前写的回答中所提到的,这里的问题是你没有明确地分配id参数:

edit_account_activation_url(@user.activation_token, email: @user.email)

在路径助手中,Rails将接受传递的对象并使用适当的属性来形成路径。

Rails是一个逻辑程序,它不是魔术;它将在您发布的路线中从id查找email@user

由于您希望使用activation_token代替id,因此您最好使用以下内容:

edit_account_activation_url(id: @user.activation_token, email: @user.email)

这应该通过查看您之前的问题和此问题来实现。您之前的问题还显示@user对象有一个ID,从而表明您对它的看法不存在错误。

答案 2 :(得分:-1)

url helper的第一个参数用作:id,不应该是nil

您的第一个论点(即@user.activation_token)是nil

您的代码似乎基于Chapter 11 of the Ruby on Rails Tutorial

我有同样的问题,对我来说,nil - 狩猎给了一些启示。我改变了:

  # Creates and assigns the activation token and digest
  def create_activation_digest
    activation_token = User.new_token
    activation_digest = User.digest activation_token
  end

为:

  # Creates and assigns the activation token and digest
  def create_activation_digest
    self.activation_token = User.new_token
    self.activation_digest = User.digest activation_token
  end

plain activation_token是一个局部变量,它隐藏了同名的对象属性。局部变量将超出create_activation_digest方法末尾的范围,保持对象属性不变,在我的情况下,仍为nil

要分配给对象属性,ruby需要在属性名称上添加self.前缀。