邮件链接路由

时间:2015-06-03 11:17:31

标签: ruby-on-rails ruby ruby-on-rails-4 routes railstutorial.org

帐户激活

我用于帐户帐户激活的路线和邮件程序链接如下:

# 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

1 个答案:

答案 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