2017-11-11 107 views
0

我下面on Rails的教程Ruby和跨越它说错误我来了,在全:ActionView::Template::Error: No route matches {:action=>"edit", :controller=>"password_resets", :email=>"[email protected]", :id=>nil}, possible unmatched constraints: [:id]Ruby on Rails的::的ActionView ::模板错误

这涉及到代码,允许用户从重置其密码表单。该错误指的路线,所以我会用routes.rb从这里开始:

get 'sessions/new' 

root 'static_pages#home' 
get  '/about',  to: 'static_pages#about' 
get  '/contact', to: 'static_pages#contact' 
get  '/help',  to: 'static_pages#help' 

get  '/signup', to: 'users#new' 
post '/signup', to: 'users#create' 
get  '/login',  to: 'sessions#new' 
post '/login',  to: 'sessions#create' 
delete '/logout', to: 'sessions#destroy' 

resources :users 
resources :account_activations, only: [:edit] 
resources :password_resets,  only: [:new, :create, :edit, :update] 

错误提到edit作用,这是在控制器内的空白。复位功能从password_resets_controllercreate作用产生希望:

def create 
    @user = User.find_by(email: params[:password_reset][:email].downcase) 
    if @user 
    @user.create_reset_digest 
    @user.send_password_reset_email 
    flash[:info] = "Email sent with reset instructions" 
    redirect_to root_url 
    else 
    flash[:danger] = "Email address not found" 
    render 'new' 
    end 
end 

def edit 
end 

此使用提交表单上的电子邮件数据库拉用户。然后调用模型中的两个方法来遍历重置过程。首先,它创建了一个令牌和create_reset_digest方法更新该用户的属性:

def create_reset_digest 
    self.activation_token = User.new_token # <- error here; wrong attribute 
    update_attributes(reset_digest: User.digest(reset_token), 
        reset_sent_at: Time.zone.now) 
end 

然后,它会发送密码重置电子邮件:

def send_password_reset_email 
    UserMailer.password_reset(self).deliver_now 
end 

在电子邮件中,有edit_password_reset_url的提我认为这是这个错误的原因。该电子邮件的观点是:

<%= link_to "Password reset", edit_password_reset_url(@user.reset_token, 
                 email: @user.email) %> 

这种方法需要用户重置令牌和电子邮件,并提出这使用户可以访问重置其密码的URL。该网址的格式为http://example.com/password_resets/reset_token/edit?email="steve%40example.com"

该错误意味着存在一个无法匹配的约束; [:id]不匹配 - 实际上,它显示为nil:id=>nil来自哪里,我怎样才能让它匹配,大概是用户ID?我是否可以暗示错误信息中的其他内容?

当我运行一个基本的测试,我得到这个错误:

test "password_reset" do 
    @user.activation_token = User.new_token 
    mail = UserMailer.password_reset(@user) 
    assert_equal "Password reset",  mail.subject 
    assert_equal ["[email protected]"],  mail.to 
    assert_equal ["[email protected]"], mail.from 
    assert_match "Hi",     mail.body.encoded 
end 

当我使用的Web应用程序,以火密码重置,我得到一个稍微不同的错误,因为它是一个ActionController::UrlGenerationError in PasswordResets#create。这突出显示了edit_password_reset_url((@user.reset_token, email: @user.email)方法。我检查了这本书,看不到这一行是不正确的。

欢迎您提供建议。

+1

你在哪里设置'@ user.reset_token'(在'link_to'中使用)?我看到类似'self.activation_token = User.new_token'。但不是像'self.reset_token = ...'那样的东西。 – jvillian

+0

谢谢@jvillian!当我盲目地剪切和粘贴方法时会发生这种情况。你绝对正确 - 我正在设置'self.activation_token'而不是''self.reset_token'。所以,大概'reset_token'是'nil'。无论如何;我已经改变了代码的一部分,一切似乎都很好。感谢您的答复。 – OnlySteveH

+0

很高兴帮助。如果您喜欢upvote/accept,我会添加为答案。 – jvillian

回答

1

看来你没有设置@user.reset_token(在link_to中使用)?我看到类似self.activation_token = User.new_token。但不是像self.reset_token = ....

+0

如果你有一分钟​​,你能否看看我在这里提出的另一个突出问题。 TIA。 https://开头计算器。COM /问题/ 47105824 /密码验证 - 失败 - 在 - 两对置的方案 – OnlySteveH

相关问题