帐户激活
我用于帐户帐户激活的路线和邮件程序链接如下:
# Route:
resources :account_activations, only: [:edit]
# Link in mailer:
<%= edit_account_activation_url(@user.activation_token, email: @user.email) %>
该链接会生成http://www.example.com/account_activations/q5lt38hQDc_959PVoo6b7A/edit?email=foo%40example.com
等链接。控制器方法使用电子邮件地址来查找用户。
更新电子邮件地址的类似内容
如果用户更改了其电子邮件地址,我现在想要使用确认链接执行类似操作。我已经设置了各种控制器和模型方法,但我认为邮件和路由中的链接出错了。我有:
# Route (should be the same as edit route above, but now for update_email):
get 'account_activations/update_email/:email' => 'account_activations#update_email', as: 'update_email'
# Link in mailer:
<%= update_email_url(@user.activation_token, email: @user.email) %>
问题:
链接应根据用户的电子邮件地址识别用户(就像激活帐户一样),并生成以下链接:http://www.example.com/account_activations/q5lt38hQDc_959PVoo6b7A/update_email?email=foo%40example.com
。相反,它现在会生成http://www.example.com/account_activations/update_email/foo@example.com
之类的链接。
我认为这是错误的路线,但我不确定如何'模仿'我用于帐户激活的编辑路线。
尝试替代路线:
get 'account_activations/update_email/:id' => 'account_activations#update_email', as: 'update_email'
。我在这里收到错误missing required keys: [:id]
。get 'account_activations/update_email' => 'account_activations#update_email', as: 'update_email'
。我在这里获得了http://www.example.com/account_activations/update_email?email=foo%40example.com
这样的链接。因此,链接中缺少令牌。resources :account_activations, only: :update
。并将链接更改为<%= account_activation_url(@user.activation_token, email: @user.email) %>
(当然,更改控制器中的方法名称)。这会产生错误消息No route matches {:action=>"update", :controller=>"account_activations", :email=>"example@example.com", :id=>nil} missing required keys: [:id]
。get 'account_activations/:token/update_email' => 'account_activations#update_email', as: 'update_email'
。这会生成错误missing required keys: [:token]
。更新
如果我使用路线:
get 'account_activations/:id/update_email' => 'account_activations#update_email', as: 'update_email'
根据{{1}} ,两者似乎相似
rake routes
对我来说,似乎我的情况与“帐户激活”相同。但是,虽然这适用于“帐户激活”,但为了更新电子邮件,当邮件程序发送链接时,会产生错误:
edit_account_activation GET /account_activations/:id/edit(.:format) account_activations#edit
update_email GET /account_activations/:id/update_email(.:format) account_activations#update_email
答案 0 :(得分:0)
get 'account_activations/update_email/:id' => 'account_activations#update_email', as: 'update_email'
。在这里我收到一条错误消息,说缺少必需的密钥:[:id]。
您收到此错误的原因是,在您的 config / routes.rb 文件中,您说的是get 'account_activations/update_email/:id
,这使得必须随时发送id
触发这条路线。当你不发送id
时,你会收到错误。
get 'account_activations/update_email' => 'account_activations#update_email', as: 'update_email'.
我在此处获得了http://www.example.com/account_activations/update_email?email=foo%40example.com.
这样的链接。因此链接中缺少令牌。
如果您确实想要将令牌与请求一起发送,您必须在get 'account_activations/update_email'
get 'account_activations/update_email/:token'
中提及它,就像resources :account_activations, only: :update
一样 - 它会附加到URL。
<%= account_activation_url(@user.activation_token, email: @user.email) %>
。并将链接更改为update
(当然,更改控制器中的方法名称)。这会产生错误消息:没有路由匹配{:action =&gt;“update”,:controller =&gt;“account_activations”,:email =&gt;“example@example.com”,:id =&gt; nil}缺少必需的键:[ :ID]
嗯,这就是我在评论中向您解释的内容。 id
方法确实需要您尝试更新的模型的id
。没有get
,它将无效。
所以,最后 - 我建议的解决方案是:使用id
路线制作自定义方法,然后发送附加网址的令牌和def guess_the_number():
number = random.randrange(20)
guessesMade = 0
print('Take a guess')
guess = input()
guess = int(guess)
while guessesMade < 6:
if guess < number:
print('Your guess is too low.')
if guess > number:
print('Your guess is too high.')
if guess == number:
break
if guess == number:
print'You got it in', guessesMade, 'guess(es)! Congratulaions!'
else:
print'I\'m sorry, the number was', number
。