我已注册,我想向用户发送电子邮件激活。但是我有一个嵌套属性,用户属于公司。
错误:
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
答案 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.
前缀。