Ruby on Rails的::的ActionView ::模板错误
我下面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_controller
的create
作用产生希望:
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)
方法。我检查了这本书,看不到这一行是不正确的。
欢迎您提供建议。
看来你没有设置@user.reset_token
(在link_to
中使用)?我看到类似self.activation_token = User.new_token
。但不是像self.reset_token = ....
。
如果你有一分钟,你能否看看我在这里提出的另一个突出问题。 TIA。 https://开头计算器。COM /问题/ 47105824 /密码验证 - 失败 - 在 - 两对置的方案 – OnlySteveH
你在哪里设置'@ user.reset_token'(在'link_to'中使用)?我看到类似'self.activation_token = User.new_token'。但不是像'self.reset_token = ...'那样的东西。 – jvillian
谢谢@jvillian!当我盲目地剪切和粘贴方法时会发生这种情况。你绝对正确 - 我正在设置'self.activation_token'而不是''self.reset_token'。所以,大概'reset_token'是'nil'。无论如何;我已经改变了代码的一部分,一切似乎都很好。感谢您的答复。 – OnlySteveH
很高兴帮助。如果您喜欢upvote/accept,我会添加为答案。 – jvillian